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

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. Entender estos conceptos clave, en muchos casos es la diferencia entre desarrollar unos procesos de carga óptimos o incurrir en Problemas de Rendimiento en SQL Server.

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




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

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.