SQL Server ColumnStoreインデックスの使用
まあ、まあ、1つだけ-クラスター化CSインデックス。
私がこれを行ったハードウェアについて読みたい場合は、こちらをご覧ください。完全に開示し、私が働いている会社のウェブサイトにそのブログ投稿を書きました。
テストに進みます!
これは、かなり大きなテーブルを作成するための一般的なコードです。Evanと同じ警告ですが、ビルドとインデックス作成に時間がかかる場合があります。
USE tempdb
CREATE TABLE t1 (Id INT NOT NULL, Amount INT NOT NULL)
;WITH T (N)
AS ( SELECT X.N
     FROM ( 
      VALUES (NULL), (NULL), (NULL),
             (NULL), (NULL), (NULL),
             (NULL), (NULL), (NULL), 
             (NULL) ) AS X (N) 
           ), NUMS (N) AS ( 
            SELECT TOP ( 710000000 ) 
                    ROW_NUMBER() OVER ( ORDER BY ( SELECT NULL )) AS N
            FROM   T AS T1, T AS T2, T AS T3, 
                   T AS T4, T AS T5, T AS T6, 
                   T AS T7, T AS T8, T AS T9, 
                   T AS T10 )
INSERT dbo.t1 WITH ( TABLOCK ) (
    Id, Amount )
SELECT NUMS.N % 999 AS Id, NUMS.N % 9999 AS Amount
FROM   NUMS;
--(705032704 row(s) affected) --Aw, close enough
まあ、エヴァンは、簡略化のために勝利したが、私はについて話してきましたその前に。
これがインデックスの定義です。ラとディーとダー。
CREATE CLUSTERED COLUMNSTORE INDEX CX_WOAHMAMA ON dbo.t1
カウントを見ると、すべてのIDにはかなり均等な分布があります。
SELECT t.Id, COUNT(*) AS [Records]
FROM dbo.t1 AS t
GROUP BY t.Id
ORDER BY t.Id
結果:
Id  Records
0   5005005
1   5005006
2   5005006
3   5005006
4   5005006
5   5005006
...
994 5005005
995 5005005
996 5005005
997 5005005
998 5005005
すべてのIDに〜5,005,005行が含まれている場合、かなり狭い範囲のIDを調べて、1,000万行の合計を取得できます。
SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 3;
結果:
Records     Total
10010012    50015062308
クエリプロファイル:
Table 't1'. Scan count 6, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 2560758, lob physical reads 0, lob read-ahead reads 0.
Table 't1'. Segment reads 4773, segment skipped 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 SQL Server Execution Times:
   CPU time = 564 ms,  elapsed time = 106 ms.
楽しみのために、より大きな集計:
SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;
結果:
Records     Total
500500505   2501989114575
クエリプロファイル:
Table 't1'. Scan count 6, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 2560758, lob physical reads 0, lob read-ahead reads 0.
Table 't1'. Segment reads 4773, segment skipped 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
 SQL Server Execution Times:
   CPU time = 1859 ms,  elapsed time = 321 ms.
お役に立てれば!