3

我有一个很奇怪的问题。

我有这样的查询,我在 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]
4

3 回答 3

5

您不能将那个索引用于具有or介于条件之间的查询。想一想:任何一个值都可以匹配,因此索引匹配不能保证没有其他记录匹配该条件。

这真的就像运行单独的搜索然后将它们匹配在一起。

于 2013-10-29T08:10:36.027 回答
0

为了使用索引,SQL-Server 会检查很多东西

1)如果过滤器是 SARG。

2)索引使用似然比(唯一记录数:记录总数)

3)要获取的记录数(如果记录较少,可以使用索引或表扫描。因为如果记录量很大,sql-server发现扫描整个表比定位和使用索引更容易。)

4)在您的查询中,因为您正在使用OR,记录数增加,在这种情况下,sql-server 发现扫描整个表比查找/使用索引更容易。如果是AND,索引使用的可能性将会增加。

于 2013-10-29T08:13:51.697 回答
0

其他回答者说的是真的。但是,您可以使用一个技巧:

SELECT TOP (20) *
(
select TOP(20) *
FROM MyTable
WHERE a = 0

union

SELECT TOP(20) *
FROM MyTable
WHERE b = 0

union

SELECT TOP(20) *
FROM MyTable
WHERE c = 0
)

每个单独的子查询都可以使用单独的索引。因此,现在您只需要 3 个单独的索引(前导列分别为 a、b 和 c),您就可以开始了。

于 2013-10-29T13:12:42.767 回答