SQL सर्वर ColumnStore इंडेक्स का उपयोग करना
ठीक है, ठीक है, बस एक - एक संकुल सीएस सूचकांक।
आप हार्डवेयर मैं तारीख को किया बारे में पढ़ना चाहते हैं, तो सिर यहाँ पर । पूर्ण प्रकटीकरण, मैंने उस कंपनी की वेबसाइट पर ब्लॉग पोस्ट लिखी जिसके लिए मैं काम करता हूं।
परीक्षण पर!
यहाँ एक बहुत बड़ी तालिका बनाने के लिए कुछ सामान्य कोड हैं। इवान के रूप में एक ही चेतावनी, यह निर्माण और सूचकांक में कुछ समय ले सकता है।
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
एक गिनती को देखते हुए, प्रत्येक आईडी में बहुत समान वितरण होता है:
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
हर ईद के साथ ~ 5,005,005 पंक्तियों के साथ, हम आपको 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.
उम्मीद है की यह मदद करेगा!