Estoy luchando contra NOLOCK en mi entorno actual. Un argumento que he escuchado es que la sobrecarga del bloqueo ralentiza una consulta. Entonces, ideé una prueba para ver cuánto podría ser esta sobrecarga.
Descubrí que NOLOCK en realidad ralentiza mi escaneo.
Al principio estaba encantado, pero ahora estoy confundido. ¿Es mi prueba inválida de alguna manera? ¿No debería NOLOCK realmente permitir un escaneo un poco más rápido? ¿Que esta pasando aqui?
Aquí está mi guión:
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())
Lo que he intentado que no funcionó:
- Se ejecuta en diferentes servidores (los mismos resultados, los servidores fueron 2016-SP1 y 2016-SP2, ambos silenciosos)
- Ejecutando en dbfiddle.uk en diferentes versiones (ruidoso, pero probablemente los mismos resultados)
- ESTABLECER NIVEL DE AISLAMIENTO en lugar de pistas (mismos resultados)
- Desactivar la escalada de bloqueo en la tabla (mismos resultados)
- Examinar el tiempo de ejecución real de la exploración en el plan de consulta real (mismos resultados)
- Sugerencia de recompilación (mismos resultados)
- Grupo de archivos de solo lectura (mismos resultados)
La exploración más prometedora proviene de eliminar la variable papelera y utilizar una consulta sin resultados. Inicialmente, esto mostró a NOLOCK como un poco más rápido, pero cuando le mostré la demostración a mi jefe, NOLOCK volvió a ser más lento.
¿Qué tiene NOLOCK que ralentiza un escaneo con asignación variable?