GuilleSQL :: Microsoft SQL Server, SSIS, y más !! Votar en los Premios Bitacoras.com a Portal GuilleSQL

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]


[Fecha del Artículo (UTC): 18/02/2009]
[Autor: GuilleSQL]


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.aspx

Saludos,
Guille



Escribir un Comentario

Para poder escribir un comentario, debe Iniciar Sesión con un usuario.

Si no dispone de un usuario, puede Registrarse y hacerse miembro.

Si dispone de un usuario, pero no recuerda sus credenciales de acceso, puede Restablecer su Contraseña.

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
  555 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160



Archivo

Febrero de 2012 (2)
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)






Esta información se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho.
This information is provided "AS IS" with no warranties, and confers no rights.

Copyright © 2007 GuilleSQL, todos los derechos reservados.
GuilleSQL.com y GuilleSQL.net son también parte de Portal GuilleSQL.

Visitas recibidas (Page Loads) en GuilleSQL (fuente: StatCounter):

screen resolution stats
Visitas