2015-02-15 3 views
0

В таблице у меня есть столбец Date, и я хочу группировать по месяцам и годам.Композитный индекс или отдельный индекс?

Я создал две колонки: DateMonth и DateYear и я наполнил их с соответствующим месяцем и лет:

UPDATE t SET DateMonth = DATEPART(month, Date), DateYear = DATEPART(year, Date) 

Таким образом, запрос GroupBy обыкновение использовать DATEPART() (SQL функции не могут воспользоваться индексов).

GroupBy запрос следующим образом:

SELECT DateMonth, DateYear, COUNT(*) AS RowsCount FROM t GROUP BY DateMonth, DateYear 

Учитывая, что информация, какой тип индекса даст лучшую производительность в проницаемой запроса GroupBy?

Каждый столбец индексируются:

CREATE INDEX IX_DateMonth ON t(DateMonth) 
CREATE INDEX IX_DateYear ON t(DateYear) 

или один индекс, который охватывает два столбца:

CREATE INDEX IX_DateMonth_DateYear ON t(DateMonth, DateYear) 

ответ

2

Ну они говорят, что лучший способ выяснить это на самом деле это сделать :)

Создал таблицу со 100 000 строк.

CREATE TABLE DateTable (DateColumn DATETIME , DateMonth INT , DateYear INT) 
GO 

declare @FromDate date = '1970-01-01' 
declare @ToDate date = '2015-12-31' 

INSERT INTO DateTable(DateColumn) 
select TOP 100000 dateadd(day, rand(checksum(newid())) * 
         (1+datediff(day, @FromDate, @ToDate)),@FromDate) 
FROM master..spt_values v cross join master..spt_values v2 
GO 

UPDATE DateTable 
set DateMonth = MONTH(DateColumn) 
    ,DateYear = YEAR(DateColumn) 
GO 

Запрос

Выполняется следующий запрос с одним индексом на двух столбцов и двух отдельных индексов на обеих колонках.

ВЫБОР DateMonth, DateYear, COUNT (*) AS RowsCount ОТ DateTable GROUP BY DateMonth, DateYear

Два отдельных Индексы

CREATE INDEX IX_DateMonth ON DateTable(DateMonth) 
GO 
CREATE INDEX IX_DateYear ON DateTable(DateYear) 
GO 

план выполнения с двумя отдельными индексами

enter image description here

One Composite Index

CREATE INDEX IX_DateMonth_DateYear7 
ON DateTable(DateMonth, DateYear) 
GO 

enter image description here

двух таблиц с различными индексами

Наконец я создал две таблицы, DateTable с двумя отдельными индексами на обеих колонках и DateTable2 с одним композитным индексом на двух столбцов и сравнил планы выполнения:

enter image description here

Мораль

Придерживайтесь одного композитного индекса, так как вы группирование по обе колонки и составного индекса приведет к индексного сканирования Non-clusterd, который будет дешевле, чем сканирование таблицы, что вы получите если у вас было два отдельных индекса на двух столбцах.

Смежные вопросы