การใช้ดัชนีSQL Server ColumnStore
ก็โอเคแค่ดัชนี 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 ที่ค่อนข้างเล็กเพื่อให้ได้ผลรวม 10 ล้านแถว
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.
หวังว่านี่จะช่วยได้!