SET NOCOUNT ON. Optimiza tus procedimientos almacenados

gpsos

Hola a todos, en el día de hoy, vamos a hablaros de un parámetro de SQL Server que puede ser útil en determinados casos a la hora de mejorar el rendimiento de un procedimiento almacenado. Se trata de SET NOCOUNT ON. Un procedimiento almacenado, se encarga de ejecutar una serie de acciones de SQL Server cuando se llama a su ejecución. Esta llamada puede ser con o sin parámetros. Estate atento a próximas entradas para ver más en detalle los procedimientos almacenados en SQL Server.

¿Qué es SET NOCOUNT ON?

Es un parámetro de SQL Server que aplica únicamente a la sesión que se está ejecutando. Con esta opción se indica al motor de base de datos, que mientras permanezca activa la sesión donde se ha ejecutado, no cuente las filas afectadas.

¿Qué beneficios obtenemos?

Con esta opción mejoramos el rendimiento de procedimientos almacenados. Es recomendable cuando afectan principalmente a un gran número de registros. También es especialmente útil para casos en los que se usen cursores.

Una vez que ya sabemos la teoría, vayamos a la práctica. Crearemos dos procedimientos almacenados casi idénticos. Ambos se basan en un cursor pero incluiremos la opción SET NOCOUNT ON en uno de ellos.

El primer procedimiento será «TestNoCountON», que incluirá el parámetro que estamos tratando en esta entrada.

CREATE OR ALTER PROCEDURE TestNoCountON
AS
BEGIN
SET NOCOUNT ON;
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=100)
BEGIN
SELECT *
FROM [WideWorldImporters].[Purchasing].[PurchaseOrderLines]
WHERE [PurchaseOrderLineID] = @intFlag
SET @intFlag = @intFlag+1
END
END
GO 

El segundo procedimiento, lo crearemos sin este parámetro:

 CREATE OR ALTER PROCEDURE TestNoCountOFF
AS
BEGIN
SET NOCOUNT OFF;
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=100)
BEGIN
SELECT *
FROM [WideWorldImporters].[Purchasing].[PurchaseOrderLines]
WHERE [PurchaseOrderLineID] = @intFlag
SET @intFlag = @intFlag+1
END
END
GO 

El primero de ellos, con SET NOCOUNT activado, se ejecuta en 6 segundos, mientras que el que lo tiene desactivado, se ejecuta en 16 segundos. Esto se debe a que no «pierde tiempo» incluyendo el número de filas afectadas.

Esperamos que esta entrada os haya servido, en caso contrario, no os preocupéis. Posiblemente, la siguiente puede que sea interesante para vosotros. Para no perderte ninguna, no dudes en apuntar a nuestra newsletter. Con solo un email al mes estarás informado de todas nuestras entradas sobre las bases de datos, Linux y el mundo Open Source. No lo pienses más y suscríbete ahora.

Fuente: https://blog.sqlauthority.com/2019/12/18/sql-server-set-nocount-impact-on-stored-procedure-performance/