IOTメトリック(timeseriesデータ)用のClustered Columnstore Index Tableがあります。これには10億行以上が含まれており、次のような構造になっています。2008年までのデバイスID値とタイムスタンプの範囲は、10,000個におよぶ10,000個の異なるDeviceId値とタイムスタンプがあります。このテーブルに対する典型的なクエリは次のようになります。SQL Server Columnstore Alignmentを最適化する方法
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.
これはよく、私はそこのようにwを信じて最適化されていません(グループ化/集計の前に)
それではNiko Neugebauerの素晴らしいスクリプトを実行して、セットアップとColumnstore Alignment https://github.com/NikoNeugebauer/CISL/blob/master/Azure/alignment.sqlを検証したところ、Columnstoreを再構築した後にこの結果が得られましたクラスタ化インデックス:
METRICIDとタイムスタンプ列は、100%の最適なアラインメントスコアを持っています。 DeviceId列もうまく整列されるようにするにはどうすればよいですか?私は最初のClustered(Rowstore)インデックスで列の順序で演奏しました。
XMLとしてクエリプランを貼り付けてくださいだけでなく、あなたは、SQL Server 2016を使用している場合は、使用しようと – TheGameiswar
dbcc clonedbとdbを共有して、他の人があなたが直面している正確なシナリオを再現できるようにします.2016を使用していない場合は、テーブルスキーマ、インデックス、統計をスクリプト化してスクリプトを共有できます – TheGameiswar
@TheGameiswar [DBCC CLONEDATABASE](https ://support.microsoft.com/en-gb/help/3177838/how-to-use-dbcc-clonedatabase-to-generate-a-schema-and-statistics-only)は、SQL Server 2014 SP2以降で使用できます。 ) – wBob