SQL Server 2016 SP2 में अधिकतम मेमोरी 25GB पर सेट की गई है, जिसमें हमारे पास एक क्वेरी है जो एक मिनट में लगभग 80 बार निष्पादित होती है। क्वेरी लगभग 4000 पृष्ठों तक फैल जाती है। यह tempdb की डिस्क पर बहुत सारे IO का कारण बनता है।
जब आप क्वेरी योजना (सरलीकृत क्वेरी) पर एक नज़र डालते हैं, तो आप देखेंगे कि अनुमानित पंक्तियों की संख्या वास्तविक पंक्तियों की संख्या के बराबर है लेकिन फिर भी फैल होती है। इसलिए आउट-ऑफ-डेट आँकड़े समस्या का कारण नहीं हो सकते।
मैंने कुछ परीक्षण किया और निम्नलिखित क्वेरी टेंपडब के लिए फैल गई:
select id --uniqueidentifier
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
लेकिन अगर मैं एक अलग कॉलम का चयन करता हूं तो कोई स्पिल नहीं होता है:
select startdate --datetime
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
इसलिए मैंने आईडी कॉलम के आकार को 'बड़ा' करने की कोशिश की:
select CONVERT(nvarchar(512),id)
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)
फिर कोई स्पिलिंग भी नहीं होती है।
यूनिकफीडिफायर को टेम्पर्डबी और स्पैटटाइम कॉलम में क्यों नहीं रखा गया है? जब मैं लगभग 20000 रिकॉर्ड हटाता हूं तो आईडी कॉलम का चयन करते समय कोई स्पिलिंग भी नहीं होती है।
निम्नलिखित स्क्रिप्ट के साथ आप समस्या को पुन: उत्पन्न कर सकते हैं:
CREATE TABLE SortProblem
(
id UNIQUEIDENTIFIER,
startdate DATETIME,
sequencenumber BIGINT,
status VARCHAR(50),
PRIMARY KEY CLUSTERED(id)
)
SET nocount ON;
WITH nums(num)
AS (SELECT TOP 103000 ROW_NUMBER()
OVER (
ORDER BY 1/0)
FROM sys.all_objects o1,
sys.all_objects o2)
INSERT INTO SortProblem
SELECT newid(),
DATEADD(millisecond, num, GETDATE()),
num,
CASE
WHEN num <= 100000 THEN 'A'
WHEN num <= 101000 THEN 'B'
WHEN num <= 102000 THEN 'C'
WHEN num <= 103000 THEN 'D'
END
FROM nums
CREATE NONCLUSTERED INDEX [IX_Status]
ON [dbo].[SortProblem]([status] ASC)
INCLUDE ([sequencenumber])