Я бы поместил индекс для каждого столбца с идентификатором в качестве включенного столбца, как указано @ttoni, а затем создал бы покрывающий индекс для идентификатора и включил 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.
вот первый индекс:
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