【问题标题】:TSQL - Order of WHERE clause change execution timeSQL - WHERE 子句更改执行时间的顺序
【发布时间】: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


【解决方案1】:

我建议您检查表的索引。 如果它们已过期或索引的字段以不同的方式排序,可能会导致计算时间不同。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多