我有一个非常繁重的查询(用于测试此行为),它在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只是放在不同的位置,会改变执行时间如此沉重?
我是我的头脑,这是SQL Server短路条件的产物,所以留下LIKE,最重的条件,作为评估的最后一个,引擎首先根据以前的条件排除大多数行,减少了对LIKE条件进行的评估。
我错了吗?
编辑:我之前用DBCC FREEPROCCACHE
执行了两个查询。
答案 0 :(得分:0)
我建议你查看你桌子的索引。 如果它们已过期或索引的字段以不同方式排序,则可能导致计算的时间不同。