【发布时间】: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