मैं अपने मौजूदा माहौल में NOLOCK के खिलाफ लड़ रहा हूं। एक तर्क मैंने सुना है कि लॉकिंग का ओवरहेड एक क्वेरी को धीमा कर देता है। इसलिए, मैंने यह देखने के लिए एक परीक्षण तैयार किया कि यह ओवरहेड कितना हो सकता है।
मुझे पता चला कि NOLOCK वास्तव में मेरे स्कैन को धीमा कर देता है।
पहले तो मुझे खुशी हुई, लेकिन अब मैं उलझन में हूँ। क्या मेरा परीक्षण किसी तरह अमान्य है? क्या NOLOCK को वास्तव में थोड़ा तेज़ स्कैन की अनुमति नहीं देनी चाहिए? यहाँ क्या हो रहा है?
यहाँ मेरी स्क्रिप्ट है:
USE TestDB
GO
--Create a five-million row table
DROP TABLE IF EXISTS dbo.JustAnotherTable
GO
CREATE TABLE dbo.JustAnotherTable (
ID INT IDENTITY PRIMARY KEY,
notID CHAR(5) NOT NULL )
INSERT dbo.JustAnotherTable
SELECT TOP 5000000 'datas'
FROM sys.all_objects a1
CROSS JOIN sys.all_objects a2
CROSS JOIN sys.all_objects a3
/********************************************/
-----Testing. Run each multiple times--------
/********************************************/
--How fast is a plain select? (I get about 587ms)
DECLARE @trash CHAR(5), @dt DATETIME = SYSDATETIME()
SELECT @trash = notID --trash variable prevents any slowdown from returning data to SSMS
FROM dbo.JustAnotherTable
ORDER BY ID
OPTION (MAXDOP 1)
SELECT DATEDIFF(MILLISECOND,@dt,SYSDATETIME())
----------------------------------------------
--Now how fast is it with NOLOCK? About 640ms for me
DECLARE @trash CHAR(5), @dt DATETIME = SYSDATETIME()
SELECT @trash = notID
FROM dbo.JustAnotherTable (NOLOCK)
ORDER BY ID --would be an allocation order scan without this, breaking the comparison
OPTION (MAXDOP 1)
SELECT DATEDIFF(MILLISECOND,@dt,SYSDATETIME())
मैंने कोशिश की है कि काम नहीं किया:
- विभिन्न सर्वरों पर चलना (समान परिणाम, सर्वर 2016-SP1 और 2016-SP2, दोनों शांत थे)
- विभिन्न संस्करणों पर dbfiddle.uk पर चल रहा है (शोर, लेकिन शायद एक ही परिणाम)
- संकेत (एक ही परिणाम) के बजाय अलगाव स्तर सेट करें
- मेज पर ताला वृद्धि को बंद करना (समान परिणाम)
- वास्तविक क्वेरी प्लान में स्कैन के वास्तविक निष्पादन समय की जांच (वही परिणाम)
- पुनरावर्ती संकेत (एक ही परिणाम)
- केवल फ़ाइल समूह पढ़ें (समान परिणाम)
सबसे आशाजनक अन्वेषण कचरा चर को हटाने और नो-रिजल्ट क्वेरी का उपयोग करने से आता है। शुरुआत में इसने NOLOCK को थोड़ा और तेज दिखाया, लेकिन जब मैंने अपने बॉस को डेमो दिखाया, तो NOLOCK धीमा हो गया।
यह NOLOCK के बारे में क्या है जो चर असाइनमेंट के साथ स्कैन को धीमा कर देता है?