我有一个 SQL 数据库和 ASP.NET Web 应用程序,我的大部分查询都涉及 SQL max 函数。
例如,下面的查询需要大约。在 ASP.NET 网站和 SSMS 上执行 36 秒(使用探查器时)。
SELECT MAX(CONVERT(FLOAT,ISNULL(Runhrs,Runho))) -
MIN(CONVERT(FLOAT,ISNULL(Runhrs,Runho))) AS ACTUALHOURSRUN
FROM REPORTINGSYSTEM.DBO.HL_LOGS
WHERE ID_LOCATION = @ID_LOCATION AND
CONVERT(VARCHAR,TIME_STAMP,102)
BETWEEN @STARTDATE AND @ENDDATE
有问题的表有大约。 5,000,000 条记录和 45 列。
执行查询以减少执行时间的最好/最快/最有效的方法是什么?
提前致谢...
最佳答案
ID_LOCATION 和 TIME_STAMP 上的索引是一个不错的选择。
但是,当您将 TIME_STAMP 字段转换为 VARCHAR 时,这将阻止它使用索引。相反,重新处理查询以消除执行 CONVERT 的需要,而是使用 DATETIME 值。
例如
SELECT MAX(CONVERT(FLOAT,ISNULL(Runhrs,Runho))) - MIN(CONVERT(FLOAT,ISNULL(Runhrs,Runho))) AS ACTUALHOURSRUN
FROM REPORTINGSYSTEM.DBO.HL_LOGS
WHERE ID_LOCATION = @ID_LOCATION AND TIME_STAMP >= @STARTDATE AND TIME_STAMP < @ENDDATE
确保@STARTDATE 和@ENDDATE 也是 DATETIME 参数(我假设这是 TIME_STAMP 列的数据类型)
我还想问 Runhrs/Runho 列是什么数据类型?如果还没有存储为 FLOAT/DECIMAL,那么它们就不能像最合适的数据类型那样存储吗?
关于asp.net - SQL MAX() 函数很慢,有没有更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114541/