Update vs cursor

24/11/2009 - 04:09 por AAAAA | Informe spam
Hola amigos,
Estoy haciendo un update de una tabla a otra de forma masiva con un select
en el update, me han comentado que mejor use un cursor qu e es mas rapido,
es eso verdad donde puedo encontrar sustento sobre eso?

Saludos

Cesar

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
24/11/2009 - 10:40 | Informe spam
Dudo que la actualización mediante un cursor sea más rápido que hacerlo de
forma masiva. Tú mismo podrías hacer la prueba; para hacerlo con un cursor
puedes basarte en las plantillas de Management Studio (menú View/Template
Explorer y seleccionas en esa ventana el archivo "Earlier versions\Using
Cursors\Declare and Use UPDATE Cursor")

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático


"AAAAA" wrote in message
news:
Hola amigos,
Estoy haciendo un update de una tabla a otra de forma masiva con un select
en el update, me han comentado que mejor use un cursor qu e es mas
rapido, es eso verdad donde puedo encontrar sustento sobre eso?

Saludos

Cesar

Respuesta Responder a este mensaje
#2 aa
24/11/2009 - 17:51 | Informe spam
El que te comento eso no tiene idea de sql.
"AAAAA" wrote in message
news:
Hola amigos,
Estoy haciendo un update de una tabla a otra de forma masiva con un select
en el update, me han comentado que mejor use un cursor qu e es mas
rapido, es eso verdad donde puedo encontrar sustento sobre eso?

Saludos

Cesar

Respuesta Responder a este mensaje
#3 Maxi Accotto
24/11/2009 - 20:43 | Informe spam
Hola, yo cuando doy charlas muestro siempre el mismo ejemplo sobre problemas
con los cursores.
Ejecutalo y fijate ;)

- CURSORES

USE tempdb
GO

CREATE TABLE T1 (C1 INT PRIMARY KEY, C2 INT, C3 CHAR(8000))
GO

DECLARE @I INT
SELECT @I = 0
WHILE (@I < 1000)
BEGIN
INSERT INTO T1 VALUES (@I,@I + 1000,'HOLA')
SET @I = @I + 1
END


BEGIN TRAN
UPDATE T1 SET C2 = 1000 + C2
COMMIT TRAN


DECLARE MYCURSOR CURSOR FOR
SELECT C2 FROM T1

OPEN MYCURSOR
GO

BEGIN TRAN
FETCH MYCURSOR
WHILE (@@FETCH_STATUS = 0)
BEGIN
UPDATE T1 SET C2 = 1000 + C2 WHERE CURRENT OF MYCURSOR
FETCH MYCURSOR
END
COMMIT TRAN



SELECT TOP 1000
TOTAL_WORKER_TIME/EXECUTION_COUNT AS AVG_CPU_COST,
EXECUTION_COUNT,
(SELECT SUBSTRING(TEXT,STATEMENT_START_OFFSET/2 + 1,
(CASE WHEN STATEMENT_END_OFFSET = -1 THEN
LEN (CONVERT(NVARCHAR(MAX),TEXT)) * 2
ELSE STATEMENT_END_OFFSET END - statement_start_offset) /2)

FROM sys.dm_exec_sql_text(SQL_HANDLE)) AS QUERY_TEXT
FROM sys.dm_exec_query_stats
ORDER BY [AVG_CPU_COST] DESC





Maxi Accotto
MVP en SQL Server
http://blog.maxiaccotto.com

"AAAAA" wrote in message
news:
Hola amigos,
Estoy haciendo un update de una tabla a otra de forma masiva con un select
en el update, me han comentado que mejor use un cursor qu e es mas
rapido, es eso verdad donde puedo encontrar sustento sobre eso?

Saludos

Cesar

Respuesta Responder a este mensaje
#4 Aguardientico
25/11/2009 - 05:03 | Informe spam
Hola Cesar,

Te cuento que el hacer un update en base a un select es mucho mejor que usar
un cursor pero.

Te comento que una vez tuve que hacer una migración de datos, eran aprox. 10
millones de registros por tabla.

Traté de hacer algunas actualizaciones basadas en select's pero
lastimosamente generaba mucho log para poder controlar rollbacks, así que la
forma más eficiente que encontré para poder hacerlo fue basado en cursores
para poder hacer commit's cada cierta cantidad de registros.

Gustavo Gonzalez

"AAAAA" wrote in message
news:
Hola amigos,
Estoy haciendo un update de una tabla a otra de forma masiva con un select
en el update, me han comentado que mejor use un cursor qu e es mas
rapido, es eso verdad donde puedo encontrar sustento sobre eso?

Saludos

Cesar


__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4631 (20091123) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com






__________ Information from ESET NOD32 Antivirus, version of virus signature database 4634 (20091124) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com
Respuesta Responder a este mensaje
#5 aa
26/11/2009 - 01:16 | Informe spam
En ese caso tenes que tener un set rowcount 250000
y cada sentencia ejecuta solo sobre 250000 registros.
"Aguardientico" <gusgon1 at nospam dot com> wrote in message
news:%
Hola Cesar,

Te cuento que el hacer un update en base a un select es mucho mejor que
usar un cursor pero.

Te comento que una vez tuve que hacer una migración de datos, eran aprox.
10 millones de registros por tabla.

Traté de hacer algunas actualizaciones basadas en select's pero
lastimosamente generaba mucho log para poder controlar rollbacks, así que
la forma más eficiente que encontré para poder hacerlo fue basado en
cursores para poder hacer commit's cada cierta cantidad de registros.

Gustavo Gonzalez

"AAAAA" wrote in message
news:
Hola amigos,
Estoy haciendo un update de una tabla a otra de forma masiva con un
select en el update, me han comentado que mejor use un cursor qu e es
mas rapido, es eso verdad donde puedo encontrar sustento sobre eso?

Saludos

Cesar


__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4631 (20091123) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com






__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4634 (20091124) __________

The message was checked by ESET NOD32 Antivirus.

http://www.eset.com



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida