为什么我的查询不是sargable

vak*_*ami 3 sql sql-server performance sql-server-2008-r2

我有一个非常奇怪的问题.

我有这样的查询,我在SQL Server 2008 R2中运行:

SELECT TOP (20) *
FROM MyTable
WHERE a = 0
    AND b = 0
    AND c = 0
Run Code Online (Sandbox Code Playgroud)

在MyTable上使用我的索引

但这个没有:

SELECT TOP (20) *
FROM MyTable
WHERE a = 0
    OR b = 0
    OR c = 0
Run Code Online (Sandbox Code Playgroud)

我想在我的程序中执行第二个查询.如何更改第二个查询以使用索引?

该指数是:

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]
Run Code Online (Sandbox Code Playgroud)

Szy*_*mon 5

您不能将这一个索引用于具有or条件的查询.试想一下:任何一个值都可以匹配,因此索引匹配不能保证没有其他记录符合该条件.

它实际上就像运行单独的搜索,然后将它们匹配在一起.