【发布时间】:2010-05-25 14:12:49
【问题描述】:
我不明白为什么这个查询在使用变量时会如此缓慢,而不是在没有变量的情况下。我阅读了一些我需要启用“动态参数”的地方,但我找不到在哪里执行此操作。
DECLARE
@BeginDate AS DATETIME
,@EndDate AS DATETIME
SELECT
@BeginDate = '2010-05-20'
,@EndDate = '2010-05-25'
-- Fix date range to include time values
SET @BeginDate = CONVERT(VARCHAR(10), ISNULL(@BeginDate, '01/01/1990'), 101) + ' 00:00'
SET @EndDate = CONVERT(VARCHAR(10), ISNULL(@EndDate, '12/31/2099'), 101) + ' 23:59'
SELECT
*
FROM
claim c
WHERE
(c.Received_Date BETWEEN @BeginDate AND @EndDate) --this is much slower
--(c.Received_Date BETWEEN '2010-05-20' AND '2010-05-25') --this is much faster
【问题讨论】:
-
你在用什么运行它?存储过程?查询分析器?
-
尝试在每次测试之前运行这两个命令(假设您没有在实时服务器上测试): DBCC FREEPROCCACHE 和 DBCC DROPCLEANBUFFERS 。它们有助于在比较查询时隐藏误导性的快速结果。
-
@William DiStefano:你能发布查询计划吗?
-
我不知道我是否可以使用 SQL 2000 的查询分析器复制/粘贴它,但这里是一个似乎包含大部分执行计划的屏幕截图:imgur.com/HgqAK.jpg
-
@CodeByMoonlight - 使用“DBCC FREEPROCCACHE”或“DBCC DROPCLEANBUFFERS”后没有变化
标签: sql sql-server tsql sql-server-2000