Verwenden von SQL Server ColumnStore- Indizes
Okay, nur einer - ein Cluster-CS-Index.
Wenn Sie mehr über die Hardware erfahren möchten, auf der ich dies getan habe, klicken Sie hier . Vollständige Offenlegung, ich schrieb diesen Blog-Beitrag auf der Website des Unternehmens, für das ich arbeite.
Auf zum Test!
Hier ist ein allgemeiner Code zum Erstellen einer ziemlich großen Tabelle. Dieselbe Warnung wie bei Evan, das Erstellen und Indizieren kann eine Weile dauern.
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
Nun, gewinnt Evan der Einfachheit halber, aber ich habe darüber gesprochen , dass vor.
Hier ist die Indexdefinition. La und dee und dah.
CREATE CLUSTERED COLUMNSTORE INDEX CX_WOAHMAMA ON dbo.t1
Bei einer Zählung hat jede ID eine ziemlich gleichmäßige Verteilung:
SELECT t.Id, COUNT(*) AS [Records]
FROM dbo.t1 AS t
GROUP BY t.Id
ORDER BY t.Id
Ergebnisse:
Id Records
0 5005005
1 5005006
2 5005006
3 5005006
4 5005006
5 5005006
...
994 5005005
995 5005005
996 5005005
997 5005005
998 5005005
Mit jeder ID mit ~ 5.005.005 Zeilen können wir uns einen ziemlich kleinen Bereich von IDs ansehen, um eine Summe von 10 Millionen Zeilen zu erhalten.
SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM dbo.t1 AS t
WHERE t.Id > 0
AND t.Id < 3;
Ergebnis:
Records Total
10010012 50015062308
Abfrageprofil:
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.
Zum Spaß eine größere Aggregation:
SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM dbo.t1 AS t
WHERE t.Id > 0
AND t.Id < 101;
Ergebnisse:
Records Total
500500505 2501989114575
Abfrageprofil:
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.
Hoffe das hilft!