Индексирование по полям DateTime и VARCHAR в SQL Server 2000, какое из них более эффективно? - PullRequest
0 голосов
/ 01 июля 2011

У нас есть CallLog таблица в Microsoft SQL Server 2000 .Таблица содержит поле CallEndTime , тип которого DATETIME, и это столбец индекса.

Обычно мы удаляем бесплатные звонки и генерируем ежемесячный статистический отчет о платах и отчет о вызове отчет, все SQL используют CallEndTime в качестве условия запроса в предложении WHERE.Из-за большого количества записей в таблице CallLog запросы выполняются медленно, поэтому мы хотим оптимизировать его, начиная с индексации.

Вопрос

Будет ли он более эффективным, если запрос с дополнительным индексированием VARCHAR столбец CallEndDate ?Такие как

-- DATETIME based query
SELECT COUNT(*) FROM CallLog WHERE CallEndTime BETWEEN '2011-06-01 00:00:00' AND '2011-06-30 23:59:59'

-- VARCHAR based queries
SELECT COUNT(*) FROM CallLog WHERE CallEndDate BETWEEN '2011-06-01' AND '2011-06-30'
SELECT COUNT(*) FROM CallLog WHERE CallEndDate LIKE '2011-06%'
SELECT COUNT(*) FROM CallLog WHERE CallEndMonth = '2011-06'

Ответы [ 2 ]

1 голос
/ 01 июля 2011
  1. Я думаю, что сравнение DateTime намного быстрее, чем оператор LIKE.
  2. Я согласен с DoctorMick в разделении вашего DateTime на постоянные столбцы Year, Month, Day
  3. дляваш запрос, который выбирает COUNT(*), проверьте, есть ли в execution plan узел Table LookUp.если это так, то это может быть потому, что ваш столбец CallEndTime имеет значение NULL.потому что вы сказали, что у вас есть [некластеризованный] индекс для столбца CallEndTime.если вы сделаете ваш столбец NOT NULL и восстановите этот индекс, считая его, вы получите INDEX SCAN, что не так уж и медленно. И я думаю, вы получите гораздо более быстрые результаты.
1 голос
/ 01 июля 2011

Это должна быть дата и время. Даты в основном хранятся в базе данных в виде числа, поэтому относительно быстро увидеть, находится ли значение между двумя числами.

На вашем месте я бы рассмотрел возможность разбить данные на несколько таблиц (по месяцам, годам и т. Д.) И создать представление для объединения данных из всех этих таблиц. Таким образом, любая функциональность, которая нуждается во всем наборе данных, может использовать представление, и все, что требует данных только за месяцы, может получить доступ к конкретной таблице, которая будет намного быстрее, поскольку она будет содержать намного меньше данных.

...