Почему индекс вряд ли что-то сделает, если это DATETIME или DATETIME2, потому что они включают часть времени? - PullRequest
8 голосов

Комментарии к вопросу «Как уменьшить время ответа простого запроса на выборку?» скажи:

  • «Каков тип данных на LaunchDate? Индекс вряд ли будет много делать, если он DATETIME или DATETIME2, потому что они включают часть времени - OMG Ponies»

  • "@ OMG - Почему кластерный индекс в столбце DateTime не улучшит производительность? Запрос представляет собой сканирование диапазона, которое позволит быстро просмотреть индекс диапазона, так как все данные будут в последовательных блоках? связанные ... msdn.microsoft.com/en-us/library/ms177416.aspx - Calgary Coder "

  • "Calgary Coder: DATETIME / 2 включает время - индекс, кластеризованный или некластеризованный, подходит для дат с дублирующимся временем, но не в диапазонах . - OMG Ponies"

Я создал тестовую таблицу с кластеризованным индексом для DATETIME тип столбца LaunchDate и наблюдаю, как индекс ищет запросы, аналогичные приведенным в предыдущем вопросе:

SELECT COUNT(primaryKeyColumn) 
FROM   MarketPlan 
WHERE  LaunchDate > @date

вместо сканирования таблицы или индекса.

Почему кластерный индекс в столбце DateTime не улучшит производительность?
Почему индекс вряд ли что-то сделает, если он DATETIME или DATETIME2, потому что он включает временную часть?

Буду признателен за сценарий, иллюстрирующий, что индексирование столбца DATETIME не повышает производительность.

Обновление: Кроме того, подразумевает ли OMG, что индекс для столбца типа DATE будет полезен, но не DATETIME и DATETIME2?

Ответы [ 2 ]

4 голосов
/ 20 ноября 2010

Я прочитал другой вопрос, понятия не имею, что означают пони OMG

3 балла :

  • Не должно иметь значения, если индекскластеризованный или некластеризованный:
  • Неважно, включено ли время тоже
  • Это просто должно быть полезно

Поиск или сканирование :

На основании статистики, если LaunchDate > @date означает, скажем, 90% строк, то, скорее всего, произойдет сканирование.Если он достаточно избирателен, то поиск более вероятен.

Независимо от кластеризации или некластеризации!

Какой индекс?

Запроскак для этого потребуется индекс для LaunchDate и primaryKeyColumn

SELECT COUNT(primaryKeyColumn) 
FROM   MarketPlan 
WHERE  LaunchDate > @date

Теперь любой некластеризованный индекс относится к кластерному индексу, который по умолчанию предполагается для PK.Таким образом, primaryKeyColumn уже неявно включен.

Суеверие

Однако COUNT(primaryKeyColumn) является суеверием .Поскольку PK не допускают NULL, это эквивалентно

SELECT COUNT(*) 
FROM   MarketPlan 
WHERE  LaunchDate > @date

SELECT COUNT(1) 
FROM   MarketPlan 
WHERE  LaunchDate > @date

Так что вам нужен только индекс для LaunchDate, кластеризованный или некластеризованный

0 голосов
/ 05 марта 2014

Индекс по столбцу даты не будет использоваться, если ваше приложение использует дату и время, которые вызывают неявное преобразование типов данных.Если вы посмотрите на план выполнения, то увидите, что к столбцу применяется внутренняя функция.Решением является изменение столбца даты на отметку времени (4) или настройку клиентского приложения на использование даты вместо даты-времени.

...