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