Предположим, у меня работает веб-сайт, на котором показаны забавные фотографии кошек. У меня есть таблица под названием CatPictures
со столбцами Filename
, Awesomeness
и DeletionDate
и следующий индекс:
create nonclustered index CatsByAwesomeness
on CatPictures (Awesomeness)
include (Filename)
where DeletionDate is null
Мой главный запрос:
select Filename from CatPictures where DeletionDate is null and Awesomeness > 10
Я, как человек, знаю, что указанный выше индекс - все, что требуется SQL Server, потому что условие фильтра индекса уже обеспечивает DeletionDate is null
часть.
SQL Server, однако, не знает этого; план выполнения моего запроса не будет использовать мой индекс:
Даже если добавить подсказку индекса, он будет по-прежнему явно проверять DeletionDate
, просматривая фактические данные таблицы:
(и, кроме того, жалуйтесь на отсутствующий индекс, который будет включать DeletionDate
).
Конечно, я мог бы
include (Filename, DeletionDate)
и он будет работать:
Но это кажется пустой тратой, чтобы включить этот столбец, поскольку это просто использует пространство без добавления новой информации.
Есть ли способ заставить SQL Server знать, что условие фильтра уже выполняет проверку DeletionDate
?