¡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. 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/