WARNING. Remplaza cursores en SQL Server

¡Hola a todos de nuevo! Esta semana vamos a ver cómo podemos reemplazar los cursores ya que en SQL Server no presentan tantas ventajas como inconvenientes.

Los cursores en SQL Server son notoriamente malos para el desempeño. En cualquier buen ambiente de desarrollo, las personas hablan acerca de los cursores como si fueran demonios a ser evadidos a toda costa. La razón para esto es plana y simple; los cursores son la mejor manera de ralentizar una aplicación. Esto es porque SQL Server, como cualquier sistema de administración de bases de datos relacionales (RDBMS), está optimizado para operaciones basadas en conjuntos.

Warning. Cursores en SQL Server

Warning. Remplaza ya tus cursores

Veamos cómo podemos transformar los cursores en otros elementos:

Partimos del siguiente ejemplo:

 DECLARE @hp INT, @fname VARCHAR (30)
 DECLARE c1 cursor FOR 
 SELECT HP,FName from Source
 OPEN c1
 FETCH NEXT FROM c1 INTO @hp,@fname
 WHILE @@FETCH_STATUS=0
                 IF @fname='Hashmatcher' SET @hp=10
                 ELSE SET @hp= HP
                 
                 INSERT Destination (HP,FName)
                 VALUE (@hp,@fname)
                 FETCH NEXT FROM c1 INTO @hp,@fname
 LOOP
 CLOSE c1
 DEALLOCATE c1 

Como podemos observar tenemos un cursor, por cada línea de la table “Source” comprueba que el nombre sea ‘Hashmatcher’ y si lo es, le pone 10 puntos.

Ahora vamos a eliminar aquellas partes que nos están restando claridad y además, eliminaremos la sentencia de Declare puesto que no será necesaria.

  SELECT HP,FName from Source
  
  
                 IF @fname='Hashmatcher' SET @hp=10
                 ELSE SET @hp= HP
                 
                 INSERT Destination (HP,FName)
                 VALUE (@hp,@fname) 

Como podemos ver, todo el cursor se reduce a 3 sentencias exclusivamente, una select, un condicional y un insert,

Ahora tenemos que ver qué vamos a insertar porque el insert no se puede quedar flotando. Necesita algo que insertar, por esto vamos a coger la select y vamos a unirla con el insert.

Solo tenemos ahora 2 componentes, el condicional y el insert. Nuestros siguiente paso será condicionar el insert en función de la información para ello vamos a utilizar un case.

INSERT Destination (HP,FName)
     SELECT 
         Case where Fname=’Hashmatcher’ then 10
         Else HP
         End
     , Fname
 From source

Como podemos observar, hemos cambiado radicalmente la query aumentando drásticamente el rendimiento.

Y recordad! Si queréis a vuestros DBA’s optimizad el código y todos seremos mucho más felices!!

HASTA LA PRÓXIMA!!

Si no quieres perderte ninguna de nuestras entradas, puedes apuntarte a nuestra newsletter, para así, estar al día de nuestras publicaciones con un sólo email al mes.

Fuente: https://www.sqlshack.com/sql-server-cursor-performance-problems/