Click here to load reader
Upload
javierasir2012
View
162
Download
0
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
BUCLES WHILE VS CURSORES
Javier García Cambronel PRIMERO DE ASIR
[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.
[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
[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
[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.
[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