Индексирование полей DateTime и VARCHAR в SQL Server 2000, какое из них более эффективно?

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

Обычно мы удаляем бесплатные звонки и составляем отчет со статистикой ежемесячной платы и отчет подробные сведения о звонках, все SQL использует CallEndTime в качестве условия запроса в _3 _ пункт. Поскольку в таблице 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'

person LiuYan 刘研    schedule 01.07.2011    source источник


Ответы (2)


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

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

person DoctorMick    schedule 01.07.2011
comment
Будет ли он быстрее, чем последний запрос на основе VARCHAR (7) или запрос на основе VARCHAR (4)? - person LiuYan 刘研; 01.07.2011

  1. Я думаю, что сравнение DateTime выполняется намного быстрее, чем оператор LIKE.
  2. Я согласен с DoctorMick на разделение даты и времени на постоянные столбцы Год, Месяц, День
  3. для вашего запроса, который выбирает COUNT(*), проверьте, есть ли в execution plan узел Table LookUp. если да, то это может быть связано с тем, что ваш столбец CallEndTime допускает значение NULL. потому что вы сказали, что у вас есть [некластеризованный] индекс по столбцу CallEndTime. если вы сделаете свой столбец NOT NULL и перестроите этот индекс, подсчет будет INDEX SCAN, что не так медленно, и я думаю, вы получите гораздо более быстрые результаты.
person Maziar Taheri    schedule 01.07.2011