Transferencia de las Estadísticas de SQL Server de una Base de Datos a otra

Nota del traductor: Algunas palabras se han mantenido en inglés por no disponer en castellano de una traducción apropiada, en el lenguaje computacional. Esas palabras son las siguientes con su traducción literal en algunas de ellas y con un pseudo castellano en otras.

Constraints: Restricciones, limitaciones, Obligaciones

Default: Por defecto, a falta de…

Setting: Ajustes, Setear

Mapping: Mapeadas, Mapeo, Cartografía

Script: Escritura, Conjunto de sentencias SQL

Object id: Indentificador

Muchas de las bases de datos en producción tienen la tendencia a crecer a cientos de gigabytes. Este tamaño no es un problema para el hardware. Sin embargo, a los desarrolladores le gusta trabajar en sus computadoras personales, incluyendo notebooks con capacidad limitada de disco, por lo tanto una base entre 10 y 100GB de tamaño es un problema. Más aun, puede se impracticable transferir tales bases de datos a través de la red o resultar una pérdida de tiempo. Por esta razón, es preferible trabajar con una base de tamaño reducido pero con el mismo esquema.

La mayor diferencia entre una base pequeña de desarrollo y una completa de producción es la distribución estadística de datos. Esto choca con las estimaciones potenciales de costo y diferentes planes de ejecución. En estas circunstancias, el desarrollador se encontrará con problemas de performance hasta que el actual plan de ejecución pueda ser verificado en la base de datos real de producción.

Una solución sobre los diferentes planes de ejecución puede ser, transferir las estadísticas de la base de datos en producción a una pequeña de desarrollo. Idealmente, esta capacidad debe ser interna a SQL Server, y los lectores deberían tener el coraje de solicitar este requerimiento a sqlwish@microsoft.com. Desde que esta capacidad es reportada en Sybase Adaptive Server Enterprise, alguien más, aparentemente, ha pensado en esto. En el ínterin, presentamos un método alternativo.

Estadísticas en SQL Server

SQL Server utiliza la optimización basado en el costo. La clave de la optimización basada en el costo, es un método de estimar las filas y páginas involucradas en cada paso del plan de ejecución. Esta es la razón por la cual SQL Server genera y mantiene la distribución de estadísticas. Las estadísticas son generadas sobre las claves de los índices y también sobre columnas que no contienen índices.  La tabla sysindexes posee una entrada por cada índice y por cada colección de estadísticas no asociadas con algún índice. Cada tabla posee una entrada en la tabla sysobjectes con una identificación única para la base de datos. La columna id en la tabla sysindexes es el id del objeto que identifica la tabla. Las columnas id e indid identifican en forma única a la fila en la tabla sysindexes. El nombre de la columna en sysindexes es el nombre del índice o el nombre de la colección de estadísticas. Cualquier colección de estadísticas puede visualizarse mediante el siguiente comando:

DBCC SHOW_STATISTICS ( table , target )

El target es el nombre del índice o el nombre de la colección de estadísticas. Un ejemplo de la salida de DBCC SHOW_STATISTICS para una colección de estadísticas basada en índices se muestra más abajo.  El primer conjunto de datos contiene información general incluyendo el día de la última actualización, total de filas, filas incluidas, etc. El segundo conjunto de datos contiene el promedio general de distribución por cada clave en sucesión. En este ejemplo, la clave principal es eventPlannerID, y la segunda y última columna clave es ID. La primera fila muestra la información sobre la distribución promedio general, por cada valor distinto de la primera clave, y la segunda fila muestra la distribución de cada valor distinto de cada clave combinada con la segunda clave.

Figura 1. DBCC SHOW_STATISTICS.

Proceso de Transferencia de Estadísticas

A continuación se describe el proceso para transferir las estadísticas de una base a otra con el mismo esquema:

1)  Actualizar las estadísticas de la base de producción en forma completa (opcional, pero recomendado).

2)  Crear a nueva base de datos con la versión completa de la base de datos fuente.

3)  Setear AUTO_CREATE_STATISTICS y AUTO_UPDATE_STATISTICS off.

4)  Crear usuarios, tipos de datos, tablas, restricciones (constraints), índices cluster (incluyendo claves primarias) y todos los demás objetos excepto los índices no clusters.

5)  Crear tablas que contengan tablas y nombre del usuario, con el objetivo de tener un mapeo entre la base de datos original y la nueva. Cargue la tabla y los nombres de usuarios en las tablas mapeadas.

6)  Crear y cargar una tabla con una copia de la tabla sysindexes tomada de la base de datos original (Opcional)

7)  Ejecutar sp_configure para permitir la actualización de las tablas del sistema.

8)  Insertar la colección de estadísticas no asociadas con los índices en la tabla sysindexes de la nueva base de datos.

9)  Crear todos los índices no clusters.

10) Actualizar las entradas en sysindexes para los valores de las estadísticas relacionadas con todas las filas de índices.

Continues…

Leave a comment

Your email address will not be published.