मैं चीजों को गति देने के लिए अनुक्रमित के साथ प्रयोग कर रहा था, लेकिन एक जुड़ने की स्थिति में, सूचकांक क्वेरी निष्पादन समय में सुधार नहीं कर रहा है और कुछ मामलों में यह चीजों को धीमा कर रहा है।
परीक्षण तालिका बनाने और उसे डेटा से भरने की क्वेरी है:
CREATE TABLE [dbo].[IndexTestTable](
[id] [int] IDENTITY(1,1) PRIMARY KEY,
[Name] [nvarchar](20) NULL,
[val1] [bigint] NULL,
[val2] [bigint] NULL)
DECLARE @counter INT;
SET @counter = 1;
WHILE @counter < 500000
BEGIN
INSERT INTO IndexTestTable
(
-- id -- this column value is auto-generated
NAME,
val1,
val2
)
VALUES
(
'Name' + CAST((@counter % 100) AS NVARCHAR),
RAND() * 10000,
RAND() * 20000
);
SET @counter = @counter + 1;
END
-- Index in question
CREATE NONCLUSTERED INDEX [IndexA] ON [dbo].[IndexTestTable]
(
[Name] ASC
)
INCLUDE ( [id],
[val1],
[val2])
अब क्वेरी 1, जिसमें सुधार किया गया है (केवल थोड़ा लेकिन सुधार सुसंगत है):
SELECT *
FROM IndexTestTable I1
JOIN IndexTestTable I2
ON I1.ID = I2.ID
WHERE I1.Name = 'Name1'
सूचकांक के बिना आँकड़े और निष्पादन योजना (इस मामले में तालिका डिफ़ॉल्ट क्लस्टर किए गए सूचकांक का उपयोग करती है):
(5000 row(s) affected)
Table 'IndexTestTable'. Scan count 2, logical reads 5580, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 109 ms, elapsed time = 294 ms.
अब इंडेक्स सक्षम होने के साथ:
(5000 row(s) affected)
Table 'IndexTestTable'. Scan count 2, logical reads 2819, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 94 ms, elapsed time = 231 ms.
अब वह क्वेरी जो इंडेक्स के कारण धीमी हो जाती है (क्वेरी अर्थहीन है क्योंकि यह केवल परीक्षण के लिए बनाई गई है):
SELECT I1.Name,
SUM(I1.val1),
SUM(I1.val2),
MIN(I2.Name),
SUM(I2.val1),
SUM(I2.val2)
FROM IndexTestTable I1
JOIN IndexTestTable I2
ON I1.Name = I2.Name
WHERE
I2.Name = 'Name1'
GROUP BY
I1.Name
क्लस्टर किए गए सूचकांक के साथ सक्षम:
(1 row(s) affected)
Table 'IndexTestTable'. Scan count 4, logical reads 60, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 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.
Table 'Worktable'. Scan count 1, logical reads 155106, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 17207 ms, elapsed time = 17337 ms.
अब सूचकांक अक्षम के साथ:
(1 row(s) affected)
Table 'IndexTestTable'. Scan count 5, logical reads 8642, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 2, logical reads 165212, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 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.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 17691 ms, elapsed time = 9073 ms.
प्रश्न हैं:
- हालांकि SQL सर्वर द्वारा इंडेक्स का सुझाव दिया गया है, लेकिन यह महत्वपूर्ण अंतर से चीजों को धीमा क्यों करता है?
- नेस्टड लूप क्या है जो अधिकांश समय ले रहा है और इसके निष्पादन समय को कैसे बेहतर बनाया जाए?
- क्या ऐसा कुछ है जो मैं गलत कर रहा हूं या छूट गया है?
- डिफ़ॉल्ट इंडेक्स के साथ (केवल प्राथमिक कुंजी पर) इसमें कम समय क्यों लगता है, और नॉन क्लस्टर्ड इंडेक्स के साथ, उपस्थित तालिका में प्रत्येक पंक्ति के लिए, सम्मिलित तालिका पंक्ति को त्वरित रूप से पाया जाना चाहिए, क्योंकि शामिल होने पर नाम स्तंभ पर है सूचकांक बनाया गया है। इंडेक्स एक्ट सक्रिय होने पर यह क्वेरी एक्जीक्यूशन प्लान और इंडेक्स सीक कॉस्ट में कम परिलक्षित होता है, लेकिन फिर भी धीमा क्यों है? इसके अलावा नेस्टेड लूप में जो बाहरी जुड़ाव है वह मंदी का कारण है?
SQL सर्वर 2012 का उपयोग करना