TSQL - WHERE子句的顺序改变执行时间

时间:2015-02-18 13:23:34

标签: sql-server sql-server-2008 tsql

我有一个非常繁重的查询(用于测试此行为),它在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执行了两个查询。

1 个答案:

答案 0 :(得分:0)

我建议你查看你桌子的索引。 如果它们已过期或索引的字段以不同方式排序,则可能导致计算的时间不同。