即使我使用索引

时间:2016-04-20 21:30:34

标签: sql sql-server indexing

我不确定我是否在这里做错了,但我在一张有数百万行的桌子上运行查询。

查询是这样的:

select * 
  from    dbo.table with (index (index_1), nolock)
          where   col1 = 15464
                  and col2 not in ('X', 'U')
                  and col3 is null
                  and col4 = 'E'

索引如下:

CREATE NONCLUSTERED INDEX [index_1] ON [dbo].[table] ([col1], [col2], [col3], [col4]) WITH (FILLFACTOR=90) ON [PRIMARY]
GO

此选择仍需要一分钟才能运行。我错过了什么?

1 个答案:

答案 0 :(得分:5)

对于此查询:

select * 
from table 
where col1 = 15464 and
      col2 not in ('X', 'U') and
      col3 is null and
      col4 = 'E';

最佳指数为table(col1, col4, col3, col2)。查询应该自动使用索引,没有提示。

在根据where子句选择索引时,您应该首先放置相等条件 - 然后是一个不等式的列。出于索引的目的,innot in通常是不等式条件。

此外,如果混合数据类型,则有时不使用索引。因此,这假设col1是数字。