我把索引上每一列与所述ID作为包含列作为@ttoni陈述,然后使上的ID覆盖索引,并包括4列,然后运行该查询:
declare @string varchar(50)
set @string='Karen'
select
a.ID
A,
B,
C,
D
from dbo.Players a
inner join
(
select
ID
from dbo.Players
where A = @string
union all
select
ID
from dbo.Players
where B = @string
union all
select
ID
from dbo.Players
where C = @string
union all
select
ID
from dbo.Players
where D = @string
) b
on a.ID=b.ID
你可以用like来切换等号,然后在变量的末尾添加百分比,如果你这样做的话,它只需要更多的sql server处理。
这里的第一个索引:
CREATE NONCLUSTERED INDEX [IDX_A] ON [dbo].[Players]
(
[A] ASC
)
INCLUDE ([ID]) 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]
GO
,这里是覆盖索引:
CREATE NONCLUSTERED INDEX [IDX_All] ON [dbo].[Players]
(
[ID] ASC
)
INCLUDE ([A],
[B],
[C],
[D]) 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]
GO
我认为在1个查询中,SQLServer只选择1个索引,其余部分是从部分结果处理的 - 在我的情况下,在列A上的“OR”hance索引将无助于B,C或D上的选择。 ..? – 2011-01-27 13:47:10