0

私のクエリは、クエリを何度も通過するたびに失速しているようです。

        status_text.Text = "Check existing records...";
        status_text.Refresh();
        using (StreamReader reader = new StreamReader(df_text_filename))
        {
            using (StreamWriter writer = new StreamWriter(df_text_filename + "_temp"))
            {
                while ((product = reader.ReadLine()) != null)
                {
                    if (product != _aff_svc.DFHeaderProd)
                    {
                        df_product = _product_factory.GetProductData(_vsi, product);
                    }
                    status_text.Text = "Checking for existing record of vendor record ID " + df_product.SKU;
                    status_text.Refresh();
                    if (_pctlr.GetBySKU(df_product.SKU) != null)
                    {
                        continue;
                    }
                    writer.WriteLine(product);
                    Application.DoEvents();
                }
                writer.Close();
            }
            reader.Close();
        }
        System.IO.File.Delete(df_text_filename);
        System.IO.File.Move(df_text_filename + "_temp", df_text_filename);  

コードは、GetBySKU を約 10 回すばやく実行し、約 1 秒ほど一時停止してから、すぐに別の 10 レコードを実行します。これは、この特定のクエリだけでなく、プロセス全体で発生します。

また、Application.DoEvents() が発生しているかどうかに関係なく発生します。

もう 1 つの問題は、一貫性がないことです。私はこのように数時間作業することができますが、突然、意図したとおりにループを通過します (期待されます)。

私の SQL サーバーは、プログラムと同じマシンで実行されています。

この動作を軽減するためにサーバー専用のリソースを調べましたが、何も見つかりませんでした。

4

2 に答える 2

1

プログラムが製品情報のテキスト ファイルを解析しているかのように見えますが、解析中に whileループでいくつかの SQL クエリを実行しています。ループ内で SQL ラウンドトリップを行うのは、ほとんどの場合、悪い考えです。

代わりに、ファイルを解析し、すべての製品アイデアを収集し、ファイルを閉じてから、SQL を 1 回呼び出して、1 つまたは複数のTVP (テーブル値パラメーター)を sproc に渡し、その sproc から必要なすべてのデータを返します。おそらく同じ数のテーブル。

編集:コメントで、ファイルが非常に大きく、多くの処理が必要であると述べました。SQL 作業を 100 のようにバッチ処理することを検討できますか?

また、SQL が調整されていないと、より多くのデータが書き込まれるにつれて継続的に遅くなります。質問には、インデックス、クエリ プランなどを分析するのに十分な情報がありませんが、データ セットが大きくなるにつれてそれを確認してください。

于 2013-05-04T12:48:27.543 に答える