【发布时间】:2013-10-29 08:03:41
【问题描述】:
我有一个很奇怪的问题。
我有这样的查询,我在 SQL Server 2008 R2 中运行:
SELECT TOP (20) *
FROM MyTable
WHERE a = 0
AND b = 0
AND c = 0
在 MyTable 上使用我的索引
但这个没有:
SELECT TOP (20) *
FROM MyTable
WHERE a = 0
OR b = 0
OR c = 0
我想在我的程序中执行第二个查询。如何更改第二个查询以使用索引?
索引是:
CREATE NONCLUSTERED INDEX [MyIndex] ON [dbo].[MyTable] (
[a] ASC,
[b] ASC,
[c] ASC
)
WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
【问题讨论】:
-
不会的。它必须搜索整个索引才能找到与
LicenseDelete=0条件匹配的行(因为IRDelete和ColorDelete值可以是任何值) -
出于同样的原因,您可以轻松地使用电话簿查找名字为“Martin”且姓氏为“Smith”的人,但查找名字为“Martin”的人或 姓“Smith”的工作量更大。电话簿不是按名字排序的,所以找到 Martins 需要阅读整本书。
-
您的意思是“或”运算符总是会破坏索引吗?没有办法修复 MyIndex 以覆盖 where 子句吗?
-
@user1121366 - 是的。 “或”不能使用索引。除了在 or-ed 列上有单独索引的情况外,在这种情况下,您可能会获得一个索引联合计划,该计划会寻找多个索引并组合结果。
标签: sql sql-server performance sql-server-2008-r2