1

我有一个 asp.net 页面,它加载一个我们知道从 SQL Server Management Studio 执行时可以正常运行的查询(在 1 到 2 秒内),但是当在 SQLCommand 中从 ASP.NET 执行时,查询需要更长的时间,我不能自问题开始以来,似乎弄清楚除了一行已添加到查询中之外发生了什么,但是我无法找到问题所在。

添加的有问题的代码行是第 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

I've had to trouble shoot these before, and they're not fun, but in my experience what I've seen is different execution plans between ASP.NET & running the query in SSMS. ASP.NET doesn't cache the query, SSMS does, but sometimes the execution plan is actually different. The culprit often times is a bad index that is being accessed out of order, here's the guide I tend to use:

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

于 2013-02-21T21:08:26.717 回答
3

有各种各样的事情可能会发生。

首先,Ivan G. 是正确的,SSMS 和您的 ASP.NET 客户端之间的连接参数和 SET 选项可能不同。如果您可以访问它,那是值得在 Profiler 中研究的东西。

其次,如果您在 SSMS 中连续多次运行查询,则可能会缓存结果,这就是它在 SSMS 中运行速度如此之快的原因。如果它在您第一次打开 SSMS 并尝试运行它时运行缓慢,但随后又加快了速度,则表明正在进行缓存。

至于为什么在连接中添加一个额外的子句会减慢速度,如果不了解更多有关您的表的信息,很难说为什么,但这样做并非不可能。是否有一个BATCH_INGR同时包含FACTORY和的索引INGR_CODE?您现在可能需要一个,因为您已将其包含INGR_CODE在您的加入条件中。

找出答案的最好方法是查看带有和不带有INGR_CODE子句的查询计划,看看它有什么不同。一个查询的成本数字是否大于另一个?有没有以前没有的表扫描?索引搜索是否变成了索引扫描?

于 2013-02-21T20:58:21.453 回答
1

这是因为查询计划缓存不一样。

这是因为您的代码和 SSMS 没有使用相同的设置并且因为参数欺骗(即 Sql Server 根据第一次 sp 执行和您这次发送的参数创建计划缓存)=> 当您通过代码和通过 SSMS 执行时您没有相同的查询执行计划。

确保您使用相同的计划:工具 -> 查询执行 -> SQL Server -> 高级 -> 取消选中“SET ARITHABORT”

于 2013-02-22T13:06:10.587 回答
-1

避免在您提到的 stroredprocedure 中调用另一个存储过程。这将解决您的问题

于 2014-07-25T09:53:13.893 回答