Sparsing
विरल स्तंभों पर कुछ परीक्षण करते समय, जैसा कि आप करते हैं, एक प्रदर्शन झटका था जो मैं इसका प्रत्यक्ष कारण जानना चाहूंगा।
DDL
मैंने दो समान तालिकाओं का निर्माण किया, जिनमें से 4 विरल स्तंभों के साथ और कोई विरल स्तंभों वाली नहीं थी।
--Non Sparse columns table & NC index
CREATE TABLE dbo.nonsparse( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
charval char(20) NULL,
varcharval varchar(20) NULL,
intval int NULL,
bigintval bigint NULL
);
CREATE INDEX IX_Nonsparse_intval_varcharval
ON dbo.nonsparse(intval,varcharval)
INCLUDE(bigintval,charval);
-- sparse columns table & NC index
CREATE TABLE dbo.sparse( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
charval char(20) SPARSE NULL ,
varcharval varchar(20) SPARSE NULL,
intval int SPARSE NULL,
bigintval bigint SPARSE NULL
);
CREATE INDEX IX_sparse_intval_varcharval
ON dbo.sparse(intval,varcharval)
INCLUDE(bigintval,charval);
DML
मैंने तब दोनों में लगभग 2540 NON-NULL मान डाले ।
INSERT INTO dbo.nonsparse WITH(TABLOCK) (charval, varcharval,intval,bigintval)
SELECT 'Val1','Val2',20,19
FROM MASTER..spt_values;
INSERT INTO dbo.sparse WITH(TABLOCK) (charval, varcharval,intval,bigintval)
SELECT 'Val1','Val2',20,19
FROM MASTER..spt_values;
बाद में, मैंने दोनों तालिकाओं में 1M NULL मान डाला
INSERT INTO dbo.nonsparse WITH(TABLOCK) (charval, varcharval,intval,bigintval)
SELECT TOP(1000000) NULL,NULL,NULL,NULL
FROM MASTER..spt_values spt1
CROSS APPLY MASTER..spt_values spt2;
INSERT INTO dbo.sparse WITH(TABLOCK) (charval, varcharval,intval,bigintval)
SELECT TOP(1000000) NULL,NULL,NULL,NULL
FROM MASTER..spt_values spt1
CROSS APPLY MASTER..spt_values spt2;
प्रश्नों
Nonsparse तालिका निष्पादन
इस क्वेरी को दो बार नव निर्मित निस्पृह तालिका पर चलाते समय:
SET STATISTICS IO, TIME ON;
SELECT * FROM dbo.nonsparse
WHERE 1= (SELECT 1) -- force non trivial plan
OPTION(RECOMPILE,MAXDOP 1);
तार्किक रीड्स 5257 पृष्ठ दिखाते हैं
(1002540 rows affected)
Table 'nonsparse'. Scan count 1, logical reads 5257, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
और सीपीयू का समय 343 एमएस है
SQL Server Execution Times:
CPU time = 343 ms, elapsed time = 3850 ms.
विरल तालिका निष्पादन
विरल तालिका पर एक ही क्वेरी को दो बार चलाना:
SELECT * FROM dbo.sparse
WHERE 1= (SELECT 1) -- force non trivial plan
OPTION(RECOMPILE,MAXDOP 1);
रीड कम हैं, 1763
(1002540 rows affected)
Table 'sparse'. Scan count 1, logical reads 1763, physical reads 3, read-ahead reads 1759, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
लेकिन सीपीयू का समय अधिक है, 547 एमएस ।
SQL Server Execution Times:
CPU time = 547 ms, elapsed time = 2406 ms.
गैर विरल तालिका निष्पादन योजना
प्रशन
मूल प्रश्न
चूंकि NULL मानों को सीधे विरल स्तंभों में संग्रहीत नहीं किया जाता है, क्या NULL मानों को परिणाम के रूप में लौटाने के कारण cpu समय में वृद्धि हो सकती है ? या क्या यह केवल प्रलेखन में उल्लिखित व्यवहार है ?
स्पार्स कॉलम गैर-मान प्राप्त करने के लिए अधिक ओवरहेड की कीमत पर अशक्त मूल्यों के लिए अंतरिक्ष आवश्यकताओं को कम करते हैं
या क्या ओवरहेड केवल रीड और स्टोरेज से संबंधित है?
निष्पादन विकल्प के बाद परिणाम छोड़ने के साथ ssms चलने पर भी, गैर-विरल (219 एमएस) की तुलना में विरल चयन का सीपीयू समय अधिक (407 एमएस) था।
संपादित करें
यह गैर अशक्त मूल्यों का अतिरेक हो सकता है, भले ही केवल 2540 मौजूद हों, लेकिन मैं अभी भी आश्वस्त नहीं हूं।
यह उसी प्रदर्शन के बारे में लगता है, लेकिन विरल कारक खो गया था।
CREATE INDEX IX_Filtered
ON dbo.sparse(charval,varcharval,intval,bigintval)
WHERE charval IS NULL
AND varcharval IS NULL
AND intval IS NULL
AND bigintval IS NULL;
CREATE INDEX IX_Filtered
ON dbo.nonsparse(charval,varcharval,intval,bigintval)
WHERE charval IS NULL
AND varcharval IS NULL
AND intval IS NULL
AND bigintval IS NULL;
SET STATISTICS IO, TIME ON;
SELECT charval,varcharval,intval,bigintval FROM dbo.sparse WITH(INDEX(IX_Filtered))
WHERE charval IS NULL AND varcharval IS NULL
AND intval IS NULL
AND bigintval IS NULL
OPTION(RECOMPILE,MAXDOP 1);
SELECT charval,varcharval,intval,bigintval
FROM dbo.nonsparse WITH(INDEX(IX_Filtered))
WHERE charval IS NULL AND
varcharval IS NULL
AND intval IS NULL
AND bigintval IS NULL
OPTION(RECOMPILE,MAXDOP 1);
एक ही निष्पादन समय के बारे में लगता है:
SQL Server Execution Times:
CPU time = 297 ms, elapsed time = 292 ms.
SQL Server Execution Times:
CPU time = 281 ms, elapsed time = 319 ms.
लेकिन तार्किक अब एक ही राशि क्यों पढ़ रहे हैं? स्पार्स कॉलम के लिए फ़िल्टर किए गए इंडेक्स में शामिल आईडी फ़ील्ड और कुछ अन्य गैर-डेटा पेजों को छोड़कर कुछ भी स्टोर नहीं करना चाहिए?
Table 'sparse'. Scan count 1, logical reads 5785,
Table 'nonsparse'. Scan count 1, logical reads 5785
और दोनों सूचकांकों का आकार:
RowCounts Used_MB Unused_MB Total_MB
1000000 45.20 0.06 45.26
ये समान आकार क्यों हैं? क्या विरल-नेस खो गया था?
फ़िल्टर किए गए इंडेक्स का उपयोग करते समय दोनों क्वेरी की योजना बनाते हैं
अधिक जानकारी
select @@version
Microsoft SQL Server 2017 (RTM-CU16) (KB4508218) - 14.0.3223.3 (X64) Jul 12 2019 17:43:08 कॉपीराइट (C) 2017 Microsoft कॉर्पोरेशन डेवलपर संस्करण (64-बिट) Windows Server 2012 R2 Datacea 6.3 (बिल्ड पर) 9600:) (हाइपरविजर)
प्रश्नों को चलाने और केवल आईडी फ़ील्ड का चयन करते समय, सीपीयू का समय तुलनीय होता है, जिसमें विरल तालिका के लिए कम तार्किक रीड होते हैं।
तालिकाओं का आकार
SchemaName TableName RowCounts Used_MB Unused_MB Total_MB
dbo nonsparse 1002540 89.54 0.10 89.64
dbo sparse 1002540 27.95 0.20 28.14
जब या तो क्लस्टर किए गए या गैर-अनुक्रमित सूचकांक के लिए मजबूर किया जाता है, तो सीपीयू समय अंतर बना रहता है।