Mevcut ortamımda NOLOCK ile mücadele ediyorum. Duyduğum bir argüman, kilitleme yükünün bir sorguyu yavaşlatması. Bu yüzden, bu yükün ne kadar olabileceğini görmek için bir test tasarladım.
NOLOCK'un taramamı gerçekten yavaşlattığını keşfettim.
İlk başta çok mutlu oldum, ama şimdi kafam karıştı. Testim bir şekilde geçersiz mi? NOLOCK aslında biraz daha hızlı taramaya izin vermemeli mi? Burada neler oluyor?
İşte benim senaryom:
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())
Ne denedim işe yaramadı:
- Farklı sunucularda çalışıyor (aynı sonuçlar, sunucular 2016-SP1 ve 2016-SP2 idi, her ikisi de sessizdi)
- Farklı sürümlerde dbfiddle.uk üzerinde çalışıyor (gürültülü, ancak muhtemelen aynı sonuçlar)
- İpuçları yerine İZOLASYON DÜZEYİNİ AYARLA (aynı sonuçlar)
- Masada kilit yükselmesini kapatma (aynı sonuçlar)
- Gerçek sorgu planında taramanın gerçek yürütme süresinin incelenmesi (aynı sonuçlar)
- İpucunu yeniden derle (aynı sonuçlar)
- Salt okunur dosya grubu (aynı sonuçlar)
En umut verici keşif, çöp değişkenini kaldırmak ve sonuçsuz bir sorgu kullanmaktır. Başlangıçta bu NOLOCK'u biraz daha hızlı gösterdi, ancak patronuma demoyu gösterdiğimde NOLOCK daha yavaştı.
Değişken atama ile taramayı yavaşlatan NOLOCK ile ilgili nedir?