Сравнение даты и времени в SQL Server 2008 - PullRequest
2 голосов
/ 15 октября 2011

Является ли следующий запрос наиболее неэффективным способом фильтрации только по полю времени и времени в SQL Server 2008?

SELECT *
FROM mytable
WHERE CAST([DATEEND] as TIME ) > "5:00PM";

Существуют ли какие-либо серьезные ошибки или проблемы с производительностью при приведении типов в операторе where?

Есть ли лучшие альтернативы или лучшие практики?

1 Ответ

4 голосов
/ 15 октября 2011

Основная проблема этого запроса в том, что он не подлежит обсуждению. Даже если столбец DATEEND проиндексирован, индекс нельзя использовать.

Единственный способ сделать этот индекс запроса дружественным - это иметь вычисляемый столбец с определением CAST([DATEEND] as TIME) и затем индексировать его.

Даже если вы сделаете это, вы вполне можете обнаружить, что индекс не используется, хотя это будет зависеть от того, насколько избирателен запрос. Поскольку в вашем запросе используется *, в индексе нужно будет выполнить поиск по ключевым словам, чтобы получить не покрытые столбцы. Точная селективность, при которой будет использоваться индекс, зависит от «точки перелома»

Вы также можете сделать индекс покрывающим, пропуская INCLUDE пропущенных столбцов, но поскольку вы выбираете все столбцы в таблице, это сделает индекс очень широким, что означает больше логических чтений для его сканирования и более дорогой вести для операторов модификации данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...