GuilleSQL :: Microsoft SQL Server, SSIS, y más !! Destroy On Sight - Listen Up !!

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


Este artículo describe las instrucciones SELECT INTO e INSERT INTO de SQL Server, como alternativas para cargar tablas en un Data Warehouse de SQL Server. Se explica la diferencia entre SELECT INTO e INSERT INTO (funcionalmente hablando), el consumo de LOG de SELECT INTO e INSERT INTO en función del Modo de Recuperación (recovery) utilizado (Simple, Registro Masivo ó Bulk-Logged, y Completo ó Full), la importancia en el rendimiento de un correcto dimensionamiento de los ficheros de datos y log de SQL Server (con ausencia de fragmentación, my god ;-), así como un buen dimensionamiento de la memoria de SQL Server, consideraciones en la eliminación y creación de índices, particionamiento, etc.

Dos sentencias que deberemos conocer muy bien para el desarrollo y programación de procesos de carga en Transact-SQL, son las sentencias SELECT INTO e INSERT INTO, algo vital cuando necesitamos desarrollar u optimizar procesos que cargan tablas con varios millones de filas, bastante habitual en entornos de Data Warehouse (DW) y Business Intelligence (BI). A lo largo de este artículo, detallaremos las diferencias funcionales que existen entre SELECT INTO e INSERT INTO, explicaremos y razonaremos las diferencias de rendimiento que podemos encontrar en función del Modo de Recuperación (Recovery) y de un buen dimensionamiento de ficheros, etc.

Debido al gran volumen del contenido de este artículo, ha sido necesario dividirlo en varios capítulos. Sin más, empezamos:

  • Introducción: SELECT INTO, INSERT INTO, y el Data Warehouse.
    Este primer capítulo es una simple introducción del presente artículo, dónde describir el alcance del mismo: conocer las diferencias entre SELECT INTO e INSERT INTO en SQL Server, conocer la implicación de la elección del Modo de Recuperación (Recovery) de SQL Server y de un buen dimensionamiento de los ficheros de base de datos, etc. Conceptos de especial importancia al trabajar con grandes volúmenes de datos en SQL Server, algo propio de entornos de Data Warehouse (DW) y Business Intelligence (BI).

  • Diferencias entre SELECT INTO e INSERT INTO
    Este capítulo describe las diferencias funcionales existentes entre SELECT INTO e INSERT INTO en SQL Server, ofreciendo una primera visión global que nos ayude a elegir entre SELECT INTO e INSERT INTO, así como nos ayude a diseñar un esbozo de nuestros procesos de carga (ej: SELECT INTO sobre tabla temporal con el completo de filas, para un posterior INSERT INTO incremental sobre la tabla definitiva). Se introduce también las diferencias de rendimiento que pueden encontrarse entre SELECT INTO e INSERT INTO en SQL Server.

  • SELECT INTO vs INSERT INTO, el LOG y el Modo de Recuperación de SQL Server
    Este capítulo es quizás uno de los más interesantes del artículo. Aquí se incluyen varias pruebas de SELECT INTO e INSERT INTO realizadas en igualdad de condiciones sobre una tabla de 250.000 filas, tomando tiempos y tamaños, probando con diferentes Modos de Recuperación y dimensionamiento de base de datos. Sinceramente, me parece bastante interesante sus resultados y conclusiones, para lo cual, he realizado una batería de pruebas en el Laboratorio de GuilleSQL, que explico paso a paso para una fácil comprensión.

  • Creación de Indices Agrupados (CLUSTERED) y No Agrupados (NONCLUSTERED)
    Este capítulo describe varios casos de creación de índices, tanto Agrupados (CLUSTERED) como No Agrupados (NONCLUSTERED), mostrando los resultados obtenidos de su creación en diferentes escenarios, tanto teniendo suficiente espacio de Datos y Log, como sin tener espacio suficiente (los ficheros tienen que crecer), considerando también la ejecución de estas creaciones de índices en Modo de Recuperación Completo (RECOVERY FULL) y Sencillo (RECOVERY SIMPLE).

  • Cómo cargar Tablas Particionadas con SELECT INTO en SQL Server: ALTER TABLE SWITCH PARTITION
    Este capítulo muestra como técnica de Carga Rápida en un Data Warehouse (u otros entornos, aunque para cargas incrementales de grandes tablas de hecho en un Data Warehouse resulta de especial interés por sus volúmenes de datos y la probabilidad de utilización del Modo de Recuperación Simple) la utilización de SELECT INTO para cargar Tablas Particionadas, mediante la creación de una tabla intermedia con SELECT INTO en una base de datos en Modo de Recuperación Simple, que asignaremos seguidamente como una Partición de la Tabla Particionada de destino a través de la sentencia ALTER TABLE SWITCH. Se explica el escenario, y se incluye código de ejemplo (CREATE PARTITION FUNCTION, CREATE PARTITION SCHEME, etc.).

  • SELECT INTO, INSERT INTO, BCP.EXE y BULK INSERT
    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.

  • SELECT INTO vs INSERT INTO: Conclusiones y Recomendaciones
    Este último capítulo incluye un resumen con las conclusiones obtenidas a lo largo de todo el artículo, principalmente un conjunto de recomendaciones cara al diseño y desarrollo de procesos de carga con SELECT INTO e INSERT INTO en SQL Server, que nos pueda servir como recordatorio general de buenas prácticas: la importancia del Modo de Recuperación (Recovery), el correcto dimensionamiento de ficheros, utilización de TEMPDB como área temporal para operaciones SELECT INTO, dimensionamiento de la memoria RAM de SQL Server, indexación, particionamiento de SQL Server, etc.

Bueno... y con esto ya está bien por hoy de SELECT INTO, INSERT INTO, y demás zarandajas...

Como siempre, espero que os sirva...

[Fecha artículo: 18/02/2009]
[Estado artículo: Cerrado]
[Autor: GuilleSQL]

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 Nov 2007
  187 usuarios registrados
  57069 pageloads/mes
  Ranking Alexa 1092744



Archivo

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 (8)
Mayo de 2009 (9)
Abril de 2009 (9)
Marzo de 2009 (2)
Febrero de 2009 (1)
Enero de 2009 (2)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (1)
Agosto de 2008 (4)
Julio de 2008 (5)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (1)
Febrero de 2008 (2)
Enero de 2008 (3)
Noviembre de 2007 (2)
Octubre de 2007 (1)






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