Anexar datos desde un recordset

05/11/2009 - 18:23 por raipon | Informe spam
Hola, me veo en la necesidad de insertar registros desde un Adodb.Recordset.
En estos momentos mediante un doble bucle recorro los registros (y los
fields) de dicho objeto y paso los valores de cada fila y cada campo a un
procedimiento almacenado que realiza el insert.

La pregunta : Seria más eficaz pasar a un store procedure una cadena xml que
permita insertar directamente un conjunto de filas. Lo pregunto porque al
mirar un plan de ejecución con esta última estrategia, veo que para sql
server tiene un coste elevado recorrer dicho conjunto de filas (obtenido con
OpenXml), ya que realiza un Scan.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
05/11/2009 - 18:40 | Informe spam
Igual lo puedes hacer todo en una única instrucción INSERT ... SELECT si nos
indicas exactamente qué es lo que estás haciendo.

"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


"raipon" wrote in message
news:%
Hola, me veo en la necesidad de insertar registros desde un
Adodb.Recordset. En estos momentos mediante un doble bucle recorro los
registros (y los fields) de dicho objeto y paso los valores de cada fila y
cada campo a un procedimiento almacenado que realiza el insert.

La pregunta : Seria más eficaz pasar a un store procedure una cadena xml
que permita insertar directamente un conjunto de filas. Lo pregunto porque
al mirar un plan de ejecución con esta última estrategia, veo que para sql
server tiene un coste elevado recorrer dicho conjunto de filas (obtenido
con OpenXml), ya que realiza un Scan.

Muchas gracias.

Respuesta Responder a este mensaje
#2 raipon
05/11/2009 - 19:00 | Informe spam
Hola, gracias por responder.
El escenario es el siguiente, tengo una serie de datos que quiero incorporar
a un servidor Sql Server 2005. Estos datos están contenidos en archivos
obtenidos con el método Save de un Adodb.Recordset. Para pasar los datos a
Sql Server, desde una aplicación intermedia, abro recordsets que tienen el
origen en dichos archivos, recorro sus filas y mediante un objeto command
que tiene como orígen un store procedure voy insertando de registro en
registro.
Los recordsets (mediante el método save ) pueden generar también una cadena
xml. He probado a pasar directamente esa cadena a un procedimiento
almacacenado y mediante OpenXml obtener un conjunto de filas valido para
poder insertar todos los registros a la vez. Sin embargo antes realizar
pruebas en un escenario real, he probado el réndimiento de n inserts de un
solo registro (pasando un valor para cada campo) y un conjunto de n filas
obtenido mediante OpenXml, y veo que el plan de ejecución real considera
mucho más rápido el insertar n filas de una en una.
Respuesta Responder a este mensaje
#3 Samuel-SMH
05/11/2009 - 23:35 | Informe spam
Hola,
muchas veces el tiempo de respuesta tambien varia deacuerdo a la cantidad de
datos.
pero que yo sepa con XML debería ser rapido, cómo te digo, quizas en tu
prueba usaste pocos registros, pero cuando trabajes con miles ahi notarás la
diferencia.
Ademas no sólo depente del tiempo de ejecución, sino tambien de los recursos
que utiliza esa operación, ambas van de la mano.
1 a 1 pude tomarte 1 miliseg.
xml pude tomarte 1 miliseg.
pero en recursos
1 a 1 te puede consumir 10% CPU
xml te puede consumir 1% CPU

Esto quiere decir que cuando te quedes con poco recursos en CPU ahí sufrirá
en ejecutarse tu proceso 1 a 1.

Saludos.
Samuel S.M.H


"raipon" escribió en el mensaje de
noticias:
Hola, gracias por responder.
El escenario es el siguiente, tengo una serie de datos que quiero
incorporar a un servidor Sql Server 2005. Estos datos están contenidos en
archivos obtenidos con el método Save de un Adodb.Recordset. Para pasar
los datos a Sql Server, desde una aplicación intermedia, abro recordsets
que tienen el origen en dichos archivos, recorro sus filas y mediante un
objeto command que tiene como orígen un store procedure voy insertando de
registro en registro.
Los recordsets (mediante el método save ) pueden generar también una
cadena xml. He probado a pasar directamente esa cadena a un procedimiento
almacacenado y mediante OpenXml obtener un conjunto de filas valido para
poder insertar todos los registros a la vez. Sin embargo antes realizar
pruebas en un escenario real, he probado el réndimiento de n inserts de un
solo registro (pasando un valor para cada campo) y un conjunto de n filas
obtenido mediante OpenXml, y veo que el plan de ejecución real considera
mucho más rápido el insertar n filas de una en una.


Respuesta Responder a este mensaje
#4 Carlos Sacristan
06/11/2009 - 09:45 | Informe spam
¿Por qué no usas un paquete de Integration Services para ese tipo de cargas
masivas? Se pensaron justamente para tareas como las que comentas

"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


"raipon" wrote in message
news:
Hola, gracias por responder.
El escenario es el siguiente, tengo una serie de datos que quiero
incorporar a un servidor Sql Server 2005. Estos datos están contenidos en
archivos obtenidos con el método Save de un Adodb.Recordset. Para pasar
los datos a Sql Server, desde una aplicación intermedia, abro recordsets
que tienen el origen en dichos archivos, recorro sus filas y mediante un
objeto command que tiene como orígen un store procedure voy insertando de
registro en registro.
Los recordsets (mediante el método save ) pueden generar también una
cadena xml. He probado a pasar directamente esa cadena a un procedimiento
almacacenado y mediante OpenXml obtener un conjunto de filas valido para
poder insertar todos los registros a la vez. Sin embargo antes realizar
pruebas en un escenario real, he probado el réndimiento de n inserts de un
solo registro (pasando un valor para cada campo) y un conjunto de n filas
obtenido mediante OpenXml, y veo que el plan de ejecución real considera
mucho más rápido el insertar n filas de una en una.


Respuesta Responder a este mensaje
#5 raipon
06/11/2009 - 09:52 | Informe spam
Gracias por responder.

Al final lo he probado ya en situación real, con una cantidad de registros
representativa, y el rendimiento es mucho mejor pasando directamente una
cadena xml que valor a valor, registro a registro. Sin embargo me queda la
duda de si realmente la mejoría está solo en la lógica de la aplicación que
hace de pasarela, pues con el primer método tan solo tiene que obtener el
xml mediante un método propio del objeto : Save, mientras que con el segundo
hay un bucle para recorrer los registros, y otro para recorrer los fields.
En fin, sea como sea, a pesar de la sorpresa al leer los resultados del
'plan de ejecución', el rendimiento es mucho mejor en el primer caso. Muchas
gracias.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida