我不确定我是否在这里做错了,但我在一张有数百万行的桌子上运行查询。
查询是这样的:
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
此选择仍需要一分钟才能运行。我错过了什么?
答案 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
子句选择索引时,您应该首先放置相等条件 - 然后是一个不等式的列。出于索引的目的,in
和not in
通常是不等式条件。
此外,如果混合数据类型,则有时不使用索引。因此,这假设col1
是数字。