Qué es más rápido: INSERT INTO o sp_executeSql

23/03/2007 - 13:44 por José Luis Capel - Aicom | Informe spam
Hola,

Tengo que hacer un volcado masivo de datos a un servidor SqlServer2000 a
través de Ado.

Actualmente estoy usando la sentencia INSERT INTO por cada fila.

Algo así:

FOR x := 1 TO 2000
...
oAdo:Execute("INSERT INTO miTabla VALUES( ..)")
...
NEXT

Me gustaría conocer vuestra opinión si cambio esa forma de hacer el insert
por


FOR x := 1 TO 2000
...
oAdo:Execute("exec sp_executesql N'INSERT INTO ..")
...
NEXT


Cualquier guia o ayuda será agradecida.

Saludos,
José Luis Capel

Preguntas similare

Leer las respuestas

#11 José Luis Capel - Aicom
26/03/2007 - 16:26 | Informe spam
José Mariano,

Hago una llamada al sp_executeSql para cada insert. Y normalmente hay entre
1000 a 2000 filas para añadir.

Saludos,
José Luis Capel


"Jose Mariano Alvarez"
escribió en el
mensaje news:%
Cuantas veces lo llamas?
Si es una sola vez no tiene sentido la diferencia.




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)


IMPORTANTE

Por favor traten de indicar la versión de SQL y Service Pack.
La inclusión de (CREATE, INSERTS, etc.) para poder reproducir el problema
también ayuda.



"José Luis Capel - Aicom" wrote in message
news:%23F%
Maxi,

He leido en el BOL (o por lo menos así lo he entendido yo) que los
sp_executeSql queda 'precompilado' en el servidor sql server con lo cual,
ante llamadas repetitivas, se procesa un poco más rápido.

¿Lo entendí bien?

Saludos y gracias por tu ayuda,
José Luis Capel

"Maxi" escribió en el mensaje
news:
Hola, no podemos comparar vacas con aviones, una cosa es insert into y
otra es SQL_dinamico donde dentro podrias tambien usar insert into


Saludos

[Microsoft MVP SQL Server]
SQLTOTALConsulting - Servicios y consultoria de SQLServer
www.sqlgurus.org
Buenos Aires - Argentina
http://msmvps.com/blogs/maxiaccotto/
"José Luis Capel - Aicom" wrote in message
news:%
Hola Maxi,

Hola, son 2 cosas totalmente distintas, si es masivo porque no usas

INSERT INTO TUTABLA
SELECT CAMPOS FROM TABLA_ORIGINAL




Ya me gustaría hacerlo como indicas... pero el caso es que los insert
masivos son de una tabla DBF (xBase) a Sql Server...

¿Cuales diferencias básicas hay entre Insert Into y sp_executeSql?

Saludos y gracias por tu ayuda.
José Luis Capel














Respuesta Responder a este mensaje
#12 DNC
26/03/2007 - 17:07 | Informe spam
tendrias que ver si en las FAQs de la empresa o en su base de
conocimiento no explican como intercambiar datos de una forma mas
directa.

igual si es ADO, podrias intentar guararlo en un recordset y pasarlo
todo junto.

algo como:
'Retrieve the results of your query
' and store them in a file.
Set rsData = New ADODB.Recordset
rsData.Fields.Append "ID", adInteger, , adFldKeyColumn
rsData.Fields.Append "Description", adVarChar, 40
rsData.Open LockType:=adLockBatchOptimistic
rsData.AddNew
rsData.Fields("ID").Value = 1
rsData.Fields("Description").Value = "First Record"
rsData.Update


igual esto es mas de programacion.-

saludos!
diego


On 26 mar, 06:57, "José Luis Capel - Aicom"
wrote:
Diego,

La inserción se haces desde un aplicativo ADO+Xailer+xHarbour
(www.xailer.es). El número de registros a insertar es variable pero oscilan
entre 1000 y 2000.

Saludos y gracias!
José Luis Capel

"DNC" escribió en el mensajenews:
ya te dijo maxi que son cosas totalmente distintas.

busca sobre BCP, BULK INSERT, tambien podrias ver algo de DTS, etc.

por lo poco que se entiende de tu pregunta piensas leer los registros
de a uno e ir insertandolos en la tabla destino uno a uno? son 2000
registros siempre? es raro!

Busca en los BOLs:
La instrucción INSERT agrega una o más filas nuevas a una tabla.
Tratada de forma simplificada, INSERT tiene la siguiente forma:

INSERT [INTO] table_or_view [(column_list)] data_values
sp_executesql
Ejecuta una instrucción o proceso por lotes de Transact-SQL que puede
utilizarse muchas veces, o que se ha generado dinámicamente. La
instrucción o proceso por lotes de Transact-SQL puede contener
parámetros

saludos!
diego

On 23 mar, 12:05, "José Luis Capel - Aicom"
wrote:



> Hola Maxi,

> > Hola, son 2 cosas totalmente distintas, si es masivo porque no usas

> > INSERT INTO TUTABLA
> > SELECT CAMPOS FROM TABLA_ORIGINAL


> Ya me gustaría hacerlo como indicas... pero el caso es que los insert
> masivos son de una tabla DBF (xBase) a Sql Server...

> ¿Cuales diferencias básicas hay entre Insert Into y sp_executeSql?

> Saludos y gracias por tu ayuda.
> José Luis Capel- Ocultar texto de la cita -

- Mostrar texto de la cita -
Respuesta Responder a este mensaje
#13 DNC
26/03/2007 - 17:39 | Informe spam
revisa http://tinyurl.com/2av6h2

saludos!
diego.-


On 26 mar, 12:07, "DNC" wrote:
tendrias que ver si en las FAQs de la empresa o en su base de
conocimiento no explican como intercambiar datos de una forma mas
directa.

igual si es ADO, podrias intentar guararlo en un recordset y pasarlo
todo junto.

algo como:
'Retrieve the results of your query
' and store them in a file.
Set rsData = New ADODB.Recordset
rsData.Fields.Append "ID", adInteger, , adFldKeyColumn
rsData.Fields.Append "Description", adVarChar, 40
rsData.Open LockType:=adLockBatchOptimistic
rsData.AddNew
rsData.Fields("ID").Value = 1
rsData.Fields("Description").Value = "First Record"
rsData.Update

igual esto es mas de programacion.-

saludos!
diego

On 26 mar, 06:57, "José Luis Capel - Aicom"
wrote:



> Diego,

> La inserción se haces desde un aplicativo ADO+Xailer+xHarbour
> (www.xailer.es). El número de registros a insertar es variable pero oscilan
> entre 1000 y 2000.

> Saludos y gracias!
> José Luis Capel

> "DNC" escribió en el mensajenews:
> ya te dijo maxi que son cosas totalmente distintas.

> busca sobre BCP, BULK INSERT, tambien podrias ver algo de DTS, etc.

> por lo poco que se entiende de tu pregunta piensas leer los registros
> de a uno e ir insertandolos en la tabla destino uno a uno? son 2000
> registros siempre? es raro!

> Busca en los BOLs:
> La instrucción INSERT agrega una o más filas nuevas a una tabla.
> Tratada de forma simplificada, INSERT tiene la siguiente forma:

> INSERT [INTO] table_or_view [(column_list)] data_values
> sp_executesql
> Ejecuta una instrucción o proceso por lotes de Transact-SQL que puede
> utilizarse muchas veces, o que se ha generado dinámicamente. La
> instrucción o proceso por lotes de Transact-SQL puede contener
> parámetros

> saludos!
> diego

> On 23 mar, 12:05, "José Luis Capel - Aicom"
> wrote:

> > Hola Maxi,

> > > Hola, son 2 cosas totalmente distintas, si es masivo porque no usas

> > > INSERT INTO TUTABLA
> > > SELECT CAMPOS FROM TABLA_ORIGINAL


> > Ya me gustaría hacerlo como indicas... pero el caso es que los insert
> > masivos son de una tabla DBF (xBase) a Sql Server...

> > ¿Cuales diferencias básicas hay entre Insert Into y sp_executeSql?

> > Saludos y gracias por tu ayuda.
> > José Luis Capel- Ocultar texto de la cita -

> - Mostrar texto de la cita -- Ocultar texto de la cita -

- Mostrar texto de la cita -
Respuesta Responder a este mensaje
#14 José Luis Capel - Aicom
26/03/2007 - 17:56 | Informe spam
Hola Diego,

¿Conoces Xailer? Veo que andas por los foros de este nuevo lenguaje de
programación oop xbase.

Yo estoy utilizando ADO... y conozco el enlace que me has enviado.

Pero el objeto recordset de ADO no es muy rápido con las inserciones... las
hagas como las hagas siempre es más rápido hacer un Execute del objeto
connection que un addnew del objeto recordset.

Gracias por tu interés y ayuda.
Saludos,
José Luis Capel

"DNC" escribió en el mensaje
news:
revisa http://tinyurl.com/2av6h2

saludos!
diego.-


On 26 mar, 12:07, "DNC" wrote:
tendrias que ver si en las FAQs de la empresa o en su base de
conocimiento no explican como intercambiar datos de una forma mas
directa.

igual si es ADO, podrias intentar guararlo en un recordset y pasarlo
todo junto.

algo como:
'Retrieve the results of your query
' and store them in a file.
Set rsData = New ADODB.Recordset
rsData.Fields.Append "ID", adInteger, , adFldKeyColumn
rsData.Fields.Append "Description", adVarChar, 40
rsData.Open LockType:=adLockBatchOptimistic
rsData.AddNew
rsData.Fields("ID").Value = 1
rsData.Fields("Description").Value = "First Record"
rsData.Update

igual esto es mas de programacion.-

saludos!
diego

On 26 mar, 06:57, "José Luis Capel - Aicom"
wrote:



> Diego,

> La inserción se haces desde un aplicativo ADO+Xailer+xHarbour
> (www.xailer.es). El número de registros a insertar es variable pero
> oscilan
> entre 1000 y 2000.

> Saludos y gracias!
> José Luis Capel

> "DNC" escribió en el
> mensajenews:
> ya te dijo maxi que son cosas totalmente distintas.

> busca sobre BCP, BULK INSERT, tambien podrias ver algo de DTS, etc.

> por lo poco que se entiende de tu pregunta piensas leer los registros
> de a uno e ir insertandolos en la tabla destino uno a uno? son 2000
> registros siempre? es raro!

> Busca en los BOLs:
> La instrucción INSERT agrega una o más filas nuevas a una tabla.
> Tratada de forma simplificada, INSERT tiene la siguiente forma:

> INSERT [INTO] table_or_view [(column_list)] data_values
> sp_executesql
> Ejecuta una instrucción o proceso por lotes de Transact-SQL que puede
> utilizarse muchas veces, o que se ha generado dinámicamente. La
> instrucción o proceso por lotes de Transact-SQL puede contener
> parámetros

> saludos!
> diego

> On 23 mar, 12:05, "José Luis Capel - Aicom"
> wrote:

> > Hola Maxi,

> > > Hola, son 2 cosas totalmente distintas, si es masivo porque no usas

> > > INSERT INTO TUTABLA
> > > SELECT CAMPOS FROM TABLA_ORIGINAL


> > Ya me gustaría hacerlo como indicas... pero el caso es que los insert
> > masivos son de una tabla DBF (xBase) a Sql Server...

> > ¿Cuales diferencias básicas hay entre Insert Into y sp_executeSql?

> > Saludos y gracias por tu ayuda.
> > José Luis Capel- Ocultar texto de la cita -

> - Mostrar texto de la cita -- Ocultar texto de la cita -

- Mostrar texto de la cita -
Respuesta Responder a este mensaje
#15 DNC
26/03/2007 - 18:21 | Informe spam
nop, acabo de verlo basado en el link que mencionaste.

igual en tu caso buscaria primero en los facbricantes del producto
pues seguro ya les han planteado esa inquietud.

saludos!
diego.-



On 26 mar, 12:56, "José Luis Capel - Aicom"
wrote:
Hola Diego,

¿Conoces Xailer? Veo que andas por los foros de este nuevo lenguaje de
programación oop xbase.

Yo estoy utilizando ADO... y conozco el enlace que me has enviado.

Pero el objeto recordset de ADO no es muy rápido con las inserciones... las
hagas como las hagas siempre es más rápido hacer un Execute del objeto
connection que un addnew del objeto recordset.

Gracias por tu interés y ayuda.
Saludos,
José Luis Capel

"DNC" escribió en el mensajenews:
revisahttp://tinyurl.com/2av6h2

saludos!
diego.-

On 26 mar, 12:07, "DNC" wrote:



> tendrias que ver si en las FAQs de la empresa o en su base de
> conocimiento no explican como intercambiar datos de una forma mas
> directa.

> igual si es ADO, podrias intentar guararlo en un recordset y pasarlo
> todo junto.

> algo como:
> 'Retrieve the results of your query
> ' and store them in a file.
> Set rsData = New ADODB.Recordset
> rsData.Fields.Append "ID", adInteger, , adFldKeyColumn
> rsData.Fields.Append "Description", adVarChar, 40
> rsData.Open LockType:=adLockBatchOptimistic
> rsData.AddNew
> rsData.Fields("ID").Value = 1
> rsData.Fields("Description").Value = "First Record"
> rsData.Update

> igual esto es mas de programacion.-

> saludos!
> diego

> On 26 mar, 06:57, "José Luis Capel - Aicom"
> wrote:

> > Diego,

> > La inserción se haces desde un aplicativo ADO+Xailer+xHarbour
> > (www.xailer.es). El número de registros a insertar es variable pero
> > oscilan
> > entre 1000 y 2000.

> > Saludos y gracias!
> > José Luis Capel

> > "DNC" escribió en el
> > mensajenews:
> > ya te dijo maxi que son cosas totalmente distintas.

> > busca sobre BCP, BULK INSERT, tambien podrias ver algo de DTS, etc.

> > por lo poco que se entiende de tu pregunta piensas leer los registros
> > de a uno e ir insertandolos en la tabla destino uno a uno? son 2000
> > registros siempre? es raro!

> > Busca en los BOLs:
> > La instrucción INSERT agrega una o más filas nuevas a una tabla.
> > Tratada de forma simplificada, INSERT tiene la siguiente forma:

> > INSERT [INTO] table_or_view [(column_list)] data_values
> > sp_executesql
> > Ejecuta una instrucción o proceso por lotes de Transact-SQL que puede
> > utilizarse muchas veces, o que se ha generado dinámicamente. La
> > instrucción o proceso por lotes de Transact-SQL puede contener
> > parámetros

> > saludos!
> > diego

> > On 23 mar, 12:05, "José Luis Capel - Aicom"
> > wrote:

> > > Hola Maxi,

> > > > Hola, son 2 cosas totalmente distintas, si es masivo porque no usas

> > > > INSERT INTO TUTABLA
> > > > SELECT CAMPOS FROM TABLA_ORIGINAL


> > > Ya me gustaría hacerlo como indicas... pero el caso es que los insert
> > > masivos son de una tabla DBF (xBase) a Sql Server...

> > > ¿Cuales diferencias básicas hay entre Insert Into y sp_executeSql?

> > > Saludos y gracias por tu ayuda.
> > > José Luis Capel- Ocultar texto de la cita -

> > - Mostrar texto de la cita -- Ocultar texto de la cita -

> - Mostrar texto de la cita -- Ocultar texto de la cita -

- Mostrar texto de la cita -
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida