GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

SELECT INTO, INSERT INTO, BCP.EXE y BULK INSERT

Volver a: [SELECT INTO, INSERT INTO y el LOG de SQL Server: alternativas para cargar tablas en un Data Warehouse]


Este capítulo aprovecha para comparar el rendimiento y costes evidenciados en las anteriores pruebas de SELECT INTO e INSERT INTO, con la utilización de operaciones de descarga y carga de ficheros (BULK INSERT y BCP.EXE), las cuales también son Operaciones de Registro Mínimo, que también hemos probado con exactamente el mismo volumen de datos (es decir, la misma tabla de 250.000 filas). De esta forma, se hace más fácil la comparación de este tipo de operaciones, sus ventajas e inconvenientes, y diferencias de rendimiento. También se detallan los detalles a tener en cuenta para que BULK INSERT y BCP.EXE realicen un registro mínimo, y así beneficiarnos de un mejor rendimiento.

En alguna vez he leído en algún foro, recomendar con rotundidad realizar una descarga a fichero y una posterior carga (con BCP.EXE ó con BULK INSERT) del fichero a la tabla de destino, defendiendo dicha alternativa por ser más rápida que una operación SELECT INTO ó INSERT INTO.

He aprovechado las presentes pruebas para realizar y medir de forma objetiva tal alternativa. El resultado es que un BCP OUT de la tabla utilizada en estas pruebas tarda 4 segundos, y un BCP IN ó un BULK INSERT de dicho fichero tarda 5 segundos (sobre una base de datos dimensionada con 100MB de datos y 100MB de LOG, y 6 segundos con 3MB de datos y 1MB de LOG).

He tenido en cuenta en dicha prueba, que para que BCP.EXE o BULK INSERT sea realmente una operación de registro mínimo, debe utilizarse la opción TABLOCK, pues en caso de no utilizar TABLOCK en la carga masiva (BCP o BULK INSERT), el tiempo de carga aumentará hasta los 13 segundos (similar a ejecutar un INSERT INTO, pero además, deberemos asumir previamente el tiempo de descarga). Creo que es evidente, que resulta mucho más efectivo un INSERT INTO de 3 segundos o un SELECT INTO de 0 segundos, que una descarga y carga de ficheros (4 + 5 = 9 segundos ó 4+13 = 17 segundos), aunque si es cierto que el tamaño de LOG es menor con BCP.EXE ó BULK INSERT (si se utiliza la opción TABLOCK, que sino, pillas ;-) que con INSERT INTO (algo, que no podemos decir de SELECT INTO, que ofrece mejor comportamiento). Las sentencias utilizadas para dicha prueba de BCP son las siguientes:

bcp.exe Stagging.GuilleSQL.USUARIOS out c:\salud_adhesion.bcp -S .\SQL2005Dev -T -n

bcp.exe Stagging.GuilleSQL.USUARIOS in c:\salud_adhesion.bcp -S .\SQL2005Dev -T -n -h"TABLOCK" -b1

Es muy importante, antes de plantearse utilizar operaciones Copia Masiva desde fichero (ej: BULK INSERT, BCP.EXE, etc.), es decir, Operaciones de Registro Mínimo, tener claro bajo qué condiciones la operación a ejecutar se comportará como una Operación de Registro Mínimo y bajo qué condiciones no se comportará como una Operación de Registro Mínimo. Especialmente importante, es la existencia o no de índices sobre la tabla de destino, así como la naturaleza de dichos índices (índices agrupados o CLUSTERED, e índices no agrupados o NONCLUSTERED), y la existencia o no de datos en la tabla de destino (es decir, si la tabla esta vacía o contiene alguna fila antes de cargar). También es importante la utilización de la sugerencia TABLOCK, el modo de registro de la base de datos de destino, y el hecho de si la tabla destino está siendo utilizada en la Réplica de SQL Server.

No quiero entretenerme más en detalle en este artículo, ya que vistos los tiempos y comparándolos con las pruebas anteriores (SELECT INTO e INSERT INTO), resultan evidentes las conclusones, quedando sólo por aportar los detalles descritos de cuándo una operación de copia masiva se comportará como una Operación de Registro Mínimo y cuando no se comportará así (importantísimo).

Por último, sólo comentar que las pruebas de BCP.EXE las he realizado desde la misma máquina que ejecuta SQL Server, es decir, no he probado a ejecutar BCP.EXE en una máquina separada de la Instancia de SQL Server. Tampoco he probado a paralelizar varias cargas masivas (es decir, ejecutar varios BCP.EXE de forma simultánea sobre la misma tabla, con el objetivo de obtener mejoras de rendimiento).

Volver a: [SELECT INTO, INSERT INTO y el LOG de SQL Server: alternativas para cargar tablas en un Data Warehouse]



Comentarios

cwisar - 21/09/2011 (UTC)
se puede crear un job con el bsp para que genere la informacion ya que yo necesito el archivo en formato .csv o de que otra manera puedo generar la informacion .

yo tengo un vista con nueve tablas se puede ejecutar el bcp o tiene que ser de una sola tabla

saludos


GuilleSQL - 21/09/2011 (UTC)
Hola cwisar,

La herramienta BCP nos ofrece varias opciones. Por ejemplo, podrías descargar a un fichero el contenido de una consulta (ej: SELECT * FROM dbo.MiVista).

Puedes mirar la ayuda de BCP en la siguiente página, en particular el ejemplo F, al final de la misma.

http://msdn.microsoft.com/en-us/library/ms162802.html

Saludos,
Guille



Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Marzo de 2019 (1)
Octubre de 2018 (1)
Julio de 2018 (1)
Junio de 2018 (4)
Mayo de 2018 (5)
Abril de 2018 (3)
Marzo de 2018 (2)
Febrero de 2018 (7)
Enero de 2018 (1)
Diciembre de 2017 (15)
Noviembre de 2017 (7)
Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Copyright © 2007 GuilleSQL, todos los derechos reservados.