我有一个加载查询的 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
是否有包含 FACTORY
和 INGR_CODE
的索引?现在您可能需要一个,因为您在加入条件中包含了 INGR_CODE
。
找出答案的最佳方法是查看带有和不带有 INGR_CODE
子句的查询计划,看看它们有何不同。一个查询的成本数字是否大于另一个?是否有以前没有的表扫描?索引查找是否变成了索引扫描?
关于c# - 在 SSMS 中运行良好的 SQL 查询在 ASP.NET 中运行非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15010892/