【问题标题】:Azure SQL Execution of second AND condition when the first one is false当第一个为假时 Azure SQL 执行第二个 AND 条件
【发布时间】:2014-12-30 16:58:40
【问题描述】:

我有以下问题:

当我在 Azure SQL 上执行查询时,second AND condition 运行,即使 第一个为 false。
表“items”包含 2048 个项目,列“Claimd”=1,只有 一个项目 Claimd=0。 该物品也是描述中包含“razer”一词的物品。

SET STATISTICS TIME on
SELECT * FROM dbo.Items
WHERE Claimd=0 AND
([Description] LIKE '%razer%' OR [Name] LIKE '%razer%')

结果:经过的时间 143 毫秒

如果我只搜索描述,我会得到以下结果:

SET STATISTICS TIME on
SELECT * FROM dbo.Items
WHERE Claimd=0 AND
[Description] LIKE '%razer%'

结果:经过 1 毫秒

的时间

只有一项 Claimd=0,这就解释了为什么结果会在 1 毫秒内显示。但是,当我想搜索带有 OR 条件的第二列时,它就像是再次搜索整个表,而不是只搜索带有“Claimd”=0 标志的表

我的括号有问题吗?我真的很想知道为什么在添加 OR 语句时执行第二个 AND 语句,即使第一个语句是错误的。

【问题讨论】:

  • 您对 Items 有哪些索引?
  • 仅在我的 ID(主键)上
  • 你的时代是可以​​重现的吗? (如果以相反的顺序运行查询,您是否看到相同的时差?可能存在缓存问题。)我对 Azure 了解不多——有没有显示查询计划的方法?
  • (另外:如果您希望它优先使用 Claimd,请尝试在其上添加索引。)
  • 是的,我运行它们的顺序无关紧要,在两列上搜索的查询将始终在 150 毫秒左右(可能检查所有项目(即使 Claimd=1)),而仅搜索一列的查询将始终为 1-10 毫秒)。有一种方法可以查看这些计划。慢的一个过滤需要 64% 的 CPU 时间,而快的没有提到“过滤”

标签: sql sql-server azure-sql-database


【解决方案1】:

实际上,这里没有“第一个条件”和“第二个条件”——查询优化器将根据其当前猜测来决定首先评估哪个会给出更快的答案。

它将根据查询、表索引、数据类型和数据本身来决定,例如它知道对没有太多数据的表进行表扫描通常是可以的。)

由于您的查询中的任何相关列都没有索引,我的建议是简单地在 Claimd 上添加索引。这应该是对优化器的一个很好的提示,即基于 Claimd 切割数据将是最快的解决方案。即使是“最佳情况”搜索,它也应该会提高速度,尽管已经有了 1 毫秒的结果,但您可能无法注意到这一点。

根据您对将要运行的查询的了解以及列中值的可能分布情况添加索引通常是一件好事,但请注意不要过早优化。如果这 143 毫秒实际上没有引起问题,那么它可能永远不会引起问题:随着更多数据被添加到表中,查询优化器可能已更改其策略,至少在所有情况下首先对 Claimd 进行表扫描。查询优化器是难以猜测的野兽。

【讨论】:

    【解决方案2】:

    根据 this 的文章以及 Stack Overflow 上的其他答案 herehere,ANSI SQL 标准没有明确保证短路。

    您的时间差异的另一个可能原因可能[Description] 上的索引,而Claimd 上没有索引。这也可以解释为什么第二个查询要快得多——它使用了第一个查询不能使用的索引)。 [不是说这你的问题,只是它可能在不了解索引和执行计划的情况下]

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2013-05-12
      • 2020-06-26
      • 2021-01-28
      相关资源
      最近更新 更多