Для этого запроса:
select *
from Table1
where Field1 = 'ABC' and rec_id <> 'D';
Лучший показатель table1(Field1, rec_id)
.
Однако ваш запрос может оказаться не в состоянии использовать индекс. Цель использования индекса для предложения where
заключается в уменьшении количества страниц, которые необходимо прочитать. Чтобы понять концепцию некластеризованных индексов на обычных строках, вам понадобятся некоторые основные идеи:
- Записи хранятся на страницах.
- Каждая страница имеет 8,192 байт (немного меньше используется для данных) и может хранить некоторое количество записей.
- Вся страница загружается в память для чтения записи.
Скажем, запись составляет около 80 байт, и на каждой странице записано 100 записей. Если 10% записей имеют Field1 = 'ABC'
, то на каждой странице будет около десяти. Это означает, что использование индекса не будет (обычно) сохранять любые чтения страниц. Если соответствует 1% записей, то на каждой странице будет по одному. Индекс по-прежнему не помогает.
Если только 0,01% записей совпадают (30 в вашем случае), то нужно прочитать только часть страниц. Это сладкое место для индексов, и там, где они действительно полезны.
Число совпадающих записей называется «избирательность». Если предложение where
не очень избирательно, то некластеризованный индекс не будет полезен.
Иногда кластерный индекс может быть полезен в этой ситуации. Однако кластеризованные индексы могут иметь дополнительные накладные расходы для insert
и некоторые транзакции update
. Таким образом, выбор индекса должен основываться на обрабатываемых запросах и других способах использования таблицы.
Как определяются ваши индексы? Вы можете добавить 'INCLUDE (Field1)' в определение индекса 'rec_id'. – Siyual
Сколько строк в таблице? Какова мощность, доля строк, возвращаемых к общему количеству строк? – Mihai
Вы также можете попробовать, если использовать индекс даже помогает, включить статистику io и использовать подсказку индекса, чтобы заставить SQL Server использовать его –