জিনিসগুলিকে গতি বাড়ানোর জন্য আমি সূচীগুলির সাথে পরীক্ষা করছিলাম, তবে যোগদানের ক্ষেত্রে সূচকটি ক্যোয়ারি এক্সিকিউশন সময়টিকে উন্নত করছে না এবং কিছু ক্ষেত্রে এটি জিনিসগুলি ধীর করে দিচ্ছে।
পরীক্ষার সারণী তৈরি করতে এবং এটি ডেটা দিয়ে পূরণ করার ক্যোয়ারীটি হ'ল:
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.
প্রশ্নগুলি হ'ল:
- যদিও সূচকটি এসকিউএল সার্ভারের দ্বারা প্রস্তাবিত, তবুও কেন এটি উল্লেখযোগ্য পার্থক্যের দ্বারা জিনিসগুলিকে মন্থর করে?
- নেস্টেড লুপ যোগ দিন যা বেশিরভাগ সময় নিচ্ছে এবং কীভাবে এটি কার্যকর করার সময়টিকে আরও উন্নত করতে পারে?
- এমন কিছু আছে যা আমি ভুল করছি বা মিস করেছি?
- ডিফল্ট সূচক (শুধুমাত্র প্রাথমিক কীতে) কেন এটি কম সময় নেয়, এবং অ ক্লাস্টারযুক্ত সূচকের উপস্থিতিতে, যোগদানের টেবিলের প্রতিটি সারির জন্য, যুক্ত টেবিল সারিটি দ্রুত খুঁজে পাওয়া উচিত, কারণ জয় নামটি কলামে রয়েছে যার উপর সূচক তৈরি করা হয়েছে। এটি ক্যোয়ারী এক্সিকিউশন পরিকল্পনায় প্রতিফলিত হয় এবং সূচি সক্রিয় থাকাকালীন সূচী অনুসন্ধান ব্যয়টি কম হয়, তবে কেন এখনও ধীর হয়? এছাড়াও নেস্টেড লুপের বাম বাহিরের জোনে কী রয়েছে যা মন্দা সৃষ্টি করছে?
এসকিউএল সার্ভার 2012 ব্যবহার করা