У меня есть таблица Clustered Columnstore Index Table для наших показателей IOT (данные временных рядов). Он содержит более 1 миллиарда строк и имеет следующую структуру:
CREATE TABLE [dbo].[Data](
[DeviceId] [bigint] NOT NULL,
[MetricId] [smallint] NOT NULL,
[TimeStamp] [datetime2](2) NOT NULL,
[Value] [real] NOT NULL
)
CREATE CLUSTERED INDEX [PK_Data] ON [dbo].[Data] ([TimeStamp],[DeviceId],[MetricId]) --WITH (DROP_EXISTING = ON)
CREATE CLUSTERED COLUMNSTORE INDEX [PK_Data] ON [dbo].[Data] WITH (DROP_EXISTING = ON, MAXDOP = 1, DATA_COMPRESSION = COLUMNSTORE_ARCHIVE)
Существует около 10 000 различных значений DeviceId и диапазон временных меток с 2008 года по настоящее время. Типичный запрос к этой таблице выглядит так:
SET STATISTICS TIME, IO ON
SELECT
[DeviceId]
,[MetricId]
,DATEADD(hh, DATEDIFF(day, '2005-01-01', [TimeStamp]), '2005-01-01') As [Date]
,MIN([Value]) as [Min]
,MAX([Value]) as [Max]
,AVG([Value]) as [Avg]
,SUM([Value]) as [Sum]
,COUNT([Value]) as [Count]
FROM
[dbo].[Data]
WHERE
[DeviceId] = 6077129891325167032
AND [MetricId] = 1000
AND [TimeStamp] BETWEEN '2017-07-01' AND '2017-07-30'
GROUP BY
[DeviceId]
,[MetricId]
,DATEDIFF(day, '2005-01-01', [TimeStamp])
ORDER BY
[DeviceId]
,[MetricId]
,DATEDIFF(day, '2005-01-01', [TimeStamp])
Когда я выполняю этот запрос, я получаю это для показателей производительности:
Поскольку на данный момент запрос, подобный указанному выше, выполняет слишком много чтений сегментов, я считаю:
Table 'Data'. Scan count 2, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 5257, lob physical reads 9, lob read-ahead reads 4000.
Table 'Data'. Segment reads 11, segment skipped 764.
Я считаю, что это плохо оптимизировано, поскольку было прочитано 11 сегментов, чтобы получить только 212 из 1 миллиарда исходных строк (до группировки/агрегации).
Затем я запустил отличные сценарии Нико Нойгебауэра, чтобы проверить нашу настройку и выравнивание Columnstore https://github.com/NikoNeugebauer/CISL/blob/master/Azure/alignment.sql, я получаю этот результат после перестроения кластеризованного индекса Columnstore:
Столбцы MetricId и TimeStamp имеют оптимальную оценку выравнивания 100%. Как мы можем убедиться, что столбец DeviceId также правильно выровнен? Я играл с порядком столбцов в исходном индексе Clustered (Rowstore), можно ли что-то оптимизировать?
Value
для ускорения запроса. Возможно, вы захотите переключить свой индексCOLUMNSTORE
на некластеризованный и включить столбецValue
. - person tj-cappelletti   schedule 06.08.2017(DeviceId, MetricId, TimeStamp)
. Это должно решить это. - person Evaldas Buinauskas   schedule 07.08.2017