Utilizzo degli indici ColumnStore di SQL Server
Bene, ok, solo uno: un indice CS cluster.
Se vuoi leggere dell'hardware su cui l'ho fatto, vai qui . Informativa completa, ho scritto quel post sul blog sul sito Web dell'azienda per cui lavoro.
Alla prova!
Ecco del codice generico per creare una tabella abbastanza grande. Stesso avvertimento di Evan, questo può richiedere del tempo per essere compilato e indicizzato.
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
Bene, Evan vince per semplicità, ma ho parlato di quella prima.
Ecco la definizione dell'indice. La e dee e dah.
CREATE CLUSTERED COLUMNSTORE INDEX CX_WOAHMAMA ON dbo.t1
Guardando un conteggio, ogni ID ha una distribuzione abbastanza uniforme:
SELECT t.Id, COUNT(*) AS [Records]
FROM dbo.t1 AS t
GROUP BY t.Id
ORDER BY t.Id
risultati:
Id Records
0 5005005
1 5005006
2 5005006
3 5005006
4 5005006
5 5005006
...
994 5005005
995 5005005
996 5005005
997 5005005
998 5005005
Con ogni ID con ~ 5.005.005 righe, possiamo esaminare una gamma piuttosto piccola di ID per ottenere una somma di 10 milioni di righe.
SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM dbo.t1 AS t
WHERE t.Id > 0
AND t.Id < 3;
Risultato:
Records Total
10010012 50015062308
Profilo della query:
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.
Per divertimento, una più grande aggregazione:
SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM dbo.t1 AS t
WHERE t.Id > 0
AND t.Id < 101;
risultati:
Records Total
500500505 2501989114575
Profilo della query:
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.
Spero che questo ti aiuti!