Я создал таблицу для проверки количества считываемых логических блоков и плана выполнения, выбранного оптимизатором запросов, сравнивая запросы, когда эта таблица имеет индекс, а когда нет.Почему иногда сканирование таблицы происходит быстрее, чем сканирование индекса?
тест стол
create table scan
(
id int identity(1, 1),
a varchar(10),
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10)
)
Когда я бегу из этих запросов:
select * from scan
select id from scan
я получил 88 и 58 логических операций чтения и алгоритм сканирования таблицы
Тогда я изменить таблица, в которой установлено ограничение pk и его кластерный идентификатор
alter table scan
add constraint fk_id primary key (id)
затем запустить те же запросы:
select * from scan
select id from scan
, и я получил 90 и 60 сканирования читает и алгоритм сканирования индекса
Возникает вопрос: если оптимизатор запросов выбрать лучший способ для запуска запроса , почему он выбирает сканирование индекса, если сканирование таблицы может читать меньше блока?
Вы просто читаете все строки - индекс ничего не делает. Добавьте предложение WHERE и посмотрите, что произойдет. – dbugger
Оптимизатор запросов * предсказывает * лучший способ запуска запроса. Как правило, это невозможно * узнать * наилучшим образом, не изучая данные, которые могли бы победить цель. В результате он не всегда будет выбирать абсолютную лучшую стратегию, но он должен быть достаточно надежным в выборе очень хорошего. Ваши данные не указывают на иное. –
Являются ли ваши номера * актуальными * читаемыми или * оцененными * считаются? На такой небольшой таблице индекс вряд ли будет особенно полезен. –