:
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
을
등호를 등호로 바꿀 수 있으며 변수의 끝에 백분율을 추가하면 그렇게하면 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가 오직 하나의 인덱스만을 선택하고 나머지는 부분 결과에서 처리되었다고 생각했다. - 어떤 경우에는 "OR"h 열 인덱스가 B, C 또는 D 선택에 도움이되지 않을 것이다. .. ??? –
@ user512602 : SQL이 여러 인덱스를 참조하는 것을 막을 수있는 방법은 없습니다. 너무 비싸기 때문에 SQL은 일반적으로 그렇게하지 않습니다. 귀하의 경우에는 아마도 통계를 사용하여 어떤 색인이 가장 적은 결과를 제공하는지 결정한 다음 나머지 검색 용어를 해당 색인에 대한 술어로 추가하십시오. 그래도 당신의 경우에 충분해야합니다. 열의 내용과 검색어에 따라 하나의 열에 하나의 색인이 없어 질 수도 있지만 여기에서 말하기는 어렵습니다. – TToni
YT 감사와 나쁜! 실행 계획을 보면 실제로 4 개의 인덱스가 모두 사용 된 것을 볼 수 있습니다. –