1

SQL Server Management Studioから実行すると正常に実行されることがわかっているクエリをロードするasp.netページがありますが、SQLCommandでASP.NETから実行すると、クエリにかなり長い時間がかかります。問題が発生してから1行がクエリに追加された以外に何が起こっているのかを理解しているようですが、問題が何であるかを特定できません。

追加された問題のあるコード行は6行目です。bi.INGR_CODE != 0

SQLステートメント

    SELECT  bh.JOB_NUMBER, j.DESCRIPTION, SUM(bi.INGR_ACTUAL) AS TOTAL
    FROM    BATCH_HEADER AS bh LEFT OUTER JOIN 
        BATCH_INGR AS bi
            ON bh.BATCH_ID = bi.BATCH_ID AND
            bh.FACTORY = bi.FACTORY AND
            bi.INGR_CODE <> 0 LEFT OUTER JOIN
    ServerNameReplaced.man_prod.dbo.JOBS AS j
        ON bh.JOB_NUMBER = j.JOB_NUMBER COLLATE database_default AND
           bh.FACTORY = j.FACTORY COLLATE database_default
    WHERE   ( bh.FACTORY = @Factory ) AND
            ( bh.DATETIME_DUMP >= @StartDate ) AND
            ( bh.DATETIME_DUMP < @EndDate )
    GROUP BY bh.JOB_NUMBER, j.DESCRIPTION
    ORDER BY bh.JOB_NUMBER

ファイルの背後にあるASP.NETコード

//Temporary List
List<BatchItem> data = new List<BatchItem>();

string SQLCommand = DBHelper.LoadSQLStatement( "batchdescription.sql" );

System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionStringNameReplaced"].ConnectionString);
System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(SQLCommand, sqlConnection );

try
{
    sqlCommand.Parameters.Add( "@StartDate", System.Data.SqlDbType.DateTime ).Value = StartDate;
    sqlCommand.Parameters.Add( "@EndDate ", System.Data.SqlDbType.DateTime ).Value = EndDate;
    sqlCommand.Parameters.Add( "@Factory", System.Data.SqlDbType.VarChar, 2 ).Value = Factory;

    sqlConnection.Open();

    SqlDataReader DataReader = sqlCommand.ExecuteReader();

    while ( DataReader.Read() )
    {
        data.Add(
            new BatchItem()
            {
                JobNumber = DataReader[0].ToString(),
                Description = DataReader[1].ToString(),
                Total = decimal.Parse( DataReader[2].ToString() )
            } );
    }
}
catch ( Exception ex )
{
    //handle exceptions
}
finally
{
    sqlConnection.Close();
}
4

4 に答える 4

3

起こっている可能性のあるすべての種類のものがあります。

まず、Ivan G.は、接続パラメーターとSETオプションがSSMSとASP.NETクライアントで異なる可能性があることを正しく理解しています。あなたがそれにアクセスできるなら、それはプロファイラーで調べる価値のあるものです。

次に、SSMSでクエリを連続して複数回実行した場合、結果がキャッシュされている可能性があります。そのため、SSMSではクエリが非常に高速に実行されます。初めてSSMSを開いて実行しようとしたときに実行速度が遅いが、その後速度が上がる場合は、キャッシュが実行されていることを示しています。

結合に1つの句を追加すると速度が低下する理由については、テーブルについて詳しく知らなければ理由を言うのは難しいですが、それが可能だったのは不可能ではありません。BATCH_INGRとの両方を含むFACTORYインデックスはありINGR_CODEますか?INGR_CODE参加条件に 含めているので、必要になる場合があります。

調べるための最良の方法は、INGR_CODE句がある場合とない場合のクエリプランを調べて、それがどのように異なるかを確認することです。一方のクエリのコストは、もう一方のクエリよりも大きいですか?以前にはなかったテーブルスキャンはありますか?インデックスシークはインデックススキャンに変わりましたか?

于 2013-02-21T20:58:21.453 に答える
3

以前はこれらをトラブルシューティングする必要があり、面白くありませんでしたが、私の経験では、ASP.NETとSSMSでのクエリの実行の間で実行プランが異なります。ASP.NETはクエリをキャッシュしませんが、SSMSはキャッシュしますが、実行プランが実際には異なる場合があります。犯人はしばしば、順不同でアクセスされている悪いインデックスです。これが私がよく使うガイドです:

http://www.sommarskog.se/query-plan-mysteries.html

于 2013-02-21T21:08:26.717 に答える
1

これは、クエリプランのキャッシュが同じではないためです。

これは、コードとSSMSが同じ設定を使用せず、パラメーターのなりすまし(つまり、SQL Serverが最初のspの実行と今回送信したパラメーターに応じてプランキャッシュを作成する)=>コードとSSMSを介して実行する場合に発生します。同じクエリ実行プランがありません。

同じプランを使用していることを確認するには:ツール->クエリ実行->SQLServer->アドバンス->「SETARITHABORT」のチェックを外します

于 2013-02-22T13:06:10.587 に答える
-1

あなたが言及したstroredprocedure内で別のストアドプロシージャを呼び出すことは避けてください。これはあなたの問題を解決します

于 2014-07-25T09:53:13.893 に答える