Vous êtes sur la page 1sur 6

BUCLES WHILE VS

CURSORES

Javier Garca Cambronel


PRIMERO DE ASIR
[BUCLES WHILE VS CURSORES]

PRCTICA BUCLES WHILE VERSUS CURSORES


Realizar la comparativa del ejemplo:
http://www.techrepublic.com/blog/datacenter/comparing-cursor-vs-while-loop-
performance-in-sql-server-2008/1741
Usa el optimizador de consultas para comparar: http://msdn.microsoft.com/en-
us/library/ff650689.aspx

CREAMOS LA TABLA EN LA CUAL VAMOS A REALIZAR LOS EJEMPLOS

Con el siguiente cdigo lo que hacemos ser crear la tabla temporal, donde vamos a trabajar
y van a actuar los ejemplos.

use tempdb
GO
IF OBJECT_ID('tempdb..CursorTest','u') IS NOT NULL
DROP TABLE CursorTest
GO
CREATE TABLE CursorTest
(
idcol INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
fld1 INT,
fld2 INT,
fld3 CHAR(800)
)
GO
SET NOCOUNT ON
DECLARE @x INT = 10000
WHILE @x > 0
BEGIN
INSERT INTO CursorTest (fld1, fld2, fld3)
SELECT 1, RAND() * 100 * DATEPART(ms, GETDATE()), LEFT(REPLICATE(CAST(NEWID() AS VARCHAR(36)),30),800)
SET @x -= 1
END
Como vemos se ejecuta perfectamente y se crea la tabla con las caractersticas indicadas.

PRIMERO DE ASIR Pgina 1


[BUCLES WHILE VS CURSORES]

EJEMPLO CON CURSOR FAST_FORWARD


DECLARE @Variable1 INT, @Variable2 INT
DECLARE CursorName CURSOR FAST_FORWARD
FOR
SELECT idcol
FROM CursorTest
OPEN CursorName
FETCH NEXT FROM CursorName
INTO @Variable1
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CAST(@Variable1 AS VARCHAR(5))
FETCH NEXT FROM CursorName
INTO @Variable1
END
CLOSE CursorName
DEALLOCATE CursorName

PRIMERO DE ASIR Pgina 2


[BUCLES WHILE VS CURSORES]

EJEMPLO CON BUCLE WHILE


DECLARE @Rows INT, @IdCol INT
SET @Rows = 1
SET @IdCol = 0
WHILE @Rows > 0
BEGIN
SELECT TOP 1
@idcol = idcol
FROM CursorTest
WHERE
idcol >= @IdCol

ORDER BY idcol
SET @Rows = @@ROWCOUNT
PRINT CAST(@IdCol AS VARCHAR(5))
SET @IdCol += 1
END

PRIMERO DE ASIR Pgina 3


[BUCLES WHILE VS CURSORES]

COMPARATIVA GENERAL DE RENDIMIENTO DE LA CONSULTA

CURSOR FAST_FORWARD BUCLE WHILE

QUE TENEMOS EN CUENTA A LA HORA DE ELEGIR UN PLAN:

Cuando elegimos un plan una de las primeras cosas que debemos tener en cuenta para
escogerlo es la estimacin de costes. Estos costes dependen de muchos aspectos tales como:
el n de operaciones de entrada/salida del disco requeridas, la utilizacin de la CPU. Una
consulta suele implicar la generacin de resultados intermedios, estos resultados estarn
directamente relacionados con el nmero de E/S.

PRIMERO DE ASIR Pgina 4


[BUCLES WHILE VS CURSORES]

CUAL PROPORCIONA MEJOR RENDIMIENTO EN TERMINO DE COSTOS?


Como podemos observar (en la figura de la pgina anterior)tanto en el costo de E/S, Como
en el Costo de CPU, como de operador y subarbol es superior en terminos de rendimiento la
consulta con el cursor fast_forward.

CURSOR BUCLE WHILE DIFERENCIA A


FAST_FORWARD FAVOR DE CURSOR
FAST_FORWARD

COSTO DE E/S 0,249792 0,826088 0,576296

COSTO DE CPU 0,003457 0,011157 0,0077

NMERO DE LECTURAS NECESARIAS EN LA BASE DE DATOS

CURSOR FAST_FORWARD

BUCLE WHILE

PRIMERO DE ASIR Pgina 5

Vous aimerez peut-être aussi