Você está na página 1de 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-loopperformance-in-sql-server-2008/1741 Usa el optimizador de consultas para comparar: http://msdn.microsoft.com/enus/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 FAST_FORWARD BUCLE WHILE DIFERENCIA A FAVOR DE CURSOR FAST_FORWARD 0,576296 0,0077

COSTO DE E/S COSTO DE CPU

0,249792 0,003457

0,826088 0,011157

NMERO DE LECTURAS NECESARIAS EN LA BASE DE DATOS


CURSOR FAST_FORWARD

BUCLE WHILE

PRIMERO DE ASIR

Pgina 5

Você também pode gostar