c# - 在 SSMS 中运行良好的 SQL 查询在 ASP.NET 中运行非常慢

标签 c# asp.net .net sql-server

我有一个加载查询的 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();
}

最佳答案

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

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

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

至于为什么在连接中添加一个额外的子句会减慢速度,如果不进一步了解您的表,很难说出原因,但这并非不可能。 BATCH_INGR 是否有包含 FACTORYINGR_CODE 的索引?现在您可能需要一个,因为您在加入条件中包含了 INGR_CODE

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

关于c# - 在 SSMS 中运行良好的 SQL 查询在 ASP.NET 中运行非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15010892/

相关文章:

c# - DataGridView 清除并重新获得焦点

asp.net - 如果用户在线,如何检查ASP.NET?

asp.net - 如何在 Gridview 中填充下拉菜单?

asp.net - ASP.NET中的端到端kerberos委派身份验证

c# - 我应该使方法虚拟还是抽象?

c# - 任务最小起订量等待

.net - 基于POCO的多层.NET框架

c# - 如何使用 Global.asax 文件重定向用户?

c# - 错误: "RPC method not found" on method that was never called

c# - 如何在 RavenDB 上查询子元素?