【发布时间】:2015-02-18 13:23:34
【问题描述】:
我有一个非常繁重的查询(用于测试这种行为),它使用了一些过滤器和一个 TEXT 列上的 LIKE。
SELECT DISTINCT somefields
FROM sometable
WHERE customer = 9
AND request LIKE '%FILE.DLL%' -- LIKE at second place
AND creationDate >= '02/08/2014'
AND lastEditDate >= '02/08/2014'
AND officeCode = 'PF'
ORDER BY creationDate DESC ,
creationTime DESC;
此查询在 29-35 分钟内运行,没有找到任何记录(我同意)。
但是如果我像这样编辑这个查询:
SELECT DISTINCT somefields
FROM sometable
WHERE customer = 9
AND creationDate >= '02/08/2014'
AND lastEditDate >= '02/08/2014'
AND officeCode = 'PF'
AND request LIKE '%FILE.DLL%' -- LIKE at last place
ORDER BY creationDate DESC ,
creationTime DESC;
第二个查询在 19 分钟内运行,因此速度提高了 30% 以上。
虽然我对 WHERE 子句的顺序提出了很多问题 应该 无关紧要,但为什么相同的查询(LIKE 只是被放置在不同的位置)会改变执行时间这么重?
I'm my head 这是 SQL Server 短路条件的产物,所以将最重的条件 LIKE 作为最后评估,引擎首先根据前面的条件排除大多数行,减少数量对 LIKE 条件进行评估。
我错了吗?
编辑:我之前用DBCC FREEPROCCACHE 执行过这两个查询。
【问题讨论】:
-
sql server 不会短路 where 条件。查看这两个执行计划,您就会发现差异在哪里。
-
我大胆猜测这更多地与缓存计划有关,其中更改查询字符串会导致重新计算(浪费时间和精力),甚至可能完全采用不同的计划。您可以下次清除缓存,和/或为两个查询包含一个实际执行计划,以便比较实际发生的情况。
-
我之前使用 DBCC FREEPROCCACHE 执行了这两个查询。
-
您如何期望获得您实际上并未发布的查询的帮助?发布实际查询和实际查询计划。
-
@mordack550 你重新测试或发现了什么?
标签: sql-server sql-server-2008 tsql