Потенциально можно увидеть улучшение производительности, добавив индекс (ы), это во многом зависит от особенностей:)
Сколько общего размера строки составляют ваши предикатные столбцы? Сколько строк вы ожидаете совпадать? Нужно ли возвращать все строки, которые соответствуют предикату, или только верхнюю 1 или верхнюю n строк?
Если вы ищете значения с высокой избирательностью / уникальностью (так мало возвращаемых строк), а предикатные столбцы - это небольшая часть всего размера строки, индекс может оказаться весьма полезным. Это все еще будет сканирование, но ваш индекс будет соответствовать большему количеству строк на страницу, чем исходная таблица.
Вот пример, где общий размер строки намного превышает размер столбца для поиска:
create table t1 (v1 varchar(100), b1 varbinary(8000))
go
--add 10k rows of filler
insert t1 values ('abc123def', cast(replicate('a', 8000) as varbinary(8000)))
go 10000
--add 1 row to find
insert t1 values ('abc456def', cast(replicate('a', 8000) as varbinary(8000)))
go
set statistics io on
go
select * from t1 where v1 like '%456%'
--shows 10001 logical reads
--create index that only contains the column(s) to search across
create index t1i1 on t1(v1)
go
select * from t1 where v1 like '%456%'
--or can force to
--shows 37 logical reads
Если вы посмотрите на фактический план выполнения, вы увидите, что механизм сканировал индекс и выполнил поиск закладок в соответствующей строке. Или вы можете напрямую сказать оптимизатору использовать индекс, если он не решил использовать этот план самостоятельно:
выберите * из t1 с помощью (индекс (t1i1)), где v1, как «% 456%»
Если у вас есть группа столбцов для поиска только в нескольких очень избирательных, вы можете создать несколько индексов и использовать подход сокращения. Например. сначала определите набор идентификаторов (или каким бы ни был ваш PK) из вашего высокоселективного индекса, а затем выполните поиск по менее избирательным столбцам с помощью фильтра по этому небольшому набору PK.
Если вам всегда нужно возвращать большой набор строк, вам почти наверняка будет лучше при сканировании таблицы.
Таким образом, возможные оптимизации во многом зависят от специфики определения вашей таблицы и селективности ваших данных.
НТН!
-Adrian