Sử dụng chỉ mục SQL Server ColumnStore
Chà, được thôi, chỉ một - một chỉ số CS co cụm.
Nếu bạn muốn đọc về phần cứng tôi đã làm điều này, hãy đi qua đây . Tiết lộ đầy đủ, tôi đã viết bài đăng trên blog của trang web của công ty tôi làm việc.
Vào bài kiểm tra!
Đây là một số mã chung để xây dựng một bảng khá lớn. Cùng một cảnh báo như Evan, điều này có thể mất một thời gian để xây dựng và lập chỉ mục.
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
Chà, Evan thắng vì đơn giản, nhưng tôi đã nói về điều đó trước đây.
Đây là định nghĩa chỉ mục. La và dee và dah.
CREATE CLUSTERED COLUMNSTORE INDEX CX_WOAHMAMA ON dbo.t1
Nhìn vào số đếm, mọi Id đều có phân phối khá đồng đều:
SELECT t.Id, COUNT(*) AS [Records]
FROM dbo.t1 AS t
GROUP BY t.Id
ORDER BY t.Id
Các kết quả:
Id Records
0 5005005
1 5005006
2 5005006
3 5005006
4 5005006
5 5005006
...
994 5005005
995 5005005
996 5005005
997 5005005
998 5005005
Với mỗi Id có ~ 5,005.005 hàng, chúng tôi có thể xem xét một phạm vi ID khá nhỏ để giúp bạn kiếm được 10 triệu hàng.
SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM dbo.t1 AS t
WHERE t.Id > 0
AND t.Id < 3;
Kết quả:
Records Total
10010012 50015062308
Hồ sơ truy vấn:
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.
Để giải trí, một tập hợp lớn hơn:
SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM dbo.t1 AS t
WHERE t.Id > 0
AND t.Id < 101;
Các kết quả:
Records Total
500500505 2501989114575
Hồ sơ truy vấn:
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.
Hi vọng điêu nay co ich!