6

Click here to load reader

Rendimiento: Bucleswhile VS cursores

Embed Size (px)

DESCRIPTION

BUCLES WHILE VS CURSORESJavier García Cambronel PRIMERO DE ASIR[BUCLES WHILE VS CURSORES]PRÁCTICA BUCLES WHILE VERSUS CURSORESRealizar 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.aspxCREAMOS LA TABLA EN LA CUAL VAMOS A REALIZAR LOS EJEMPLOSCon el siguiente código lo que hacemos será crear la tabla t

Citation preview

Page 1: Rendimiento: Bucleswhile VS cursores

BUCLES WHILE VS CURSORES

Javier García Cambronel PRIMERO DE ASIR

Page 2: Rendimiento: Bucleswhile VS cursores

[BUCLES WHILE VS CURSORES]

PRIMERO DE ASIR Página 1

PRÁCTICA 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 código 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 características indicadas.

Page 3: Rendimiento: Bucleswhile VS cursores

[BUCLES WHILE VS CURSORES]

PRIMERO DE ASIR Página 2

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

Page 4: Rendimiento: Bucleswhile VS cursores

[BUCLES WHILE VS CURSORES]

PRIMERO DE ASIR Página 3

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

Page 5: Rendimiento: Bucleswhile VS cursores

[BUCLES WHILE VS CURSORES]

PRIMERO DE ASIR Página 4

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 estimación de costes. Estos costes dependen de muchos aspectos tales como:

el nº de operaciones de entrada/salida del disco requeridas, la utilización de la CPU. Una

consulta suele implicar la generación de resultados intermedios, estos resultados estarán

directamente relacionados con el número de E/S.

Page 6: Rendimiento: Bucleswhile VS cursores

[BUCLES WHILE VS CURSORES]

PRIMERO DE ASIR Página 5

¿CUAL PROPORCIONA MEJOR RENDIMIENTO EN TERMINO DE COSTOS?

Como podemos observar (en la figura de la página 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

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

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

NÚMERO DE LECTURAS NECESARIAS EN LA BASE DE DATOS

CURSOR FAST_FORWARD

BUCLE WHILE