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

Insertar las Estadísticas

Insertar las colecciones de estadísticas no asociadas con índices en la tabla sysindexes de la nueva base de datos. La columna status con una máscara de bit 64, corresponde a estadísticas no asociadas a índices. Este paso debe ejecutarse antes de la creación de los índices no cluster. Con los índices cluster creados solamente, en la nueva base de datos, los únicos valores de indid en la tabla sysindexes son 0, representando las tablas organizadas en modo heap, y con valor 1 representan los índices cluster. Las estadísticas no asociadas con índices, ni con índices no cluster tienen valores de indid entre 2 y 254. El valor 255 representa texto o imágenes. Esto permite una copia simple de la totalidad de las filas de la tabla sysindexes, desde la base de datos original a ser insertadas en tabla sysindexes, de la nueva base de datos con los identificadores nuevos y originales. Note que la última columna de sysindexes no está seteada debido a que es una columna del tipo computed.

INSERT sysindexes(

id,status,first,indid,root,minlen,keycnt,groupid,dpages,reserved,used,rowcnt,

rowmodctr,reserved3,reserved4,xmaxlen,maxirow,OrigFillFactor,StatVersion,

reserved2,FirstIAM,impid,lockflags,pgmodctr,keys,name,statblob)

SELECT o.id, status,first,indid,root,minlen,keycnt,groupid,dpages,reserved,used,rowcnt,

rowmodctr,reserved3, reserved4,xmaxlen,maxirow,OrigFillFactor,StatVersion,

reserved2,FirstIAM,impid,lockflags,pgmodctr,keys,s.name,statblob

FROM [tindexes] s

INNER JOIN [tobjects] o ON > o.oid = s.id

WHERE  (s.status & 64) = 64

GO

Crear Índices no Cluster y Actualizar Sysindexes

Una vez que las estadísticas no asociadas con los índices han sido insertadas en la tabla sysindexes, los índices no cluster pueden ser creados. No tiene importancia que los valores de indid para los índices no cluster concuerden con los valores originales de indid. Las sentencias siguientes, actualizan la nueva tabla sysindexes con las estadísticas de datos requeridas desde la copia de la tabla original sysindexes.

UPDATE i SET dpages = s.dpages, reserved = s.reserved, used = s.used, rowcnt = s.rowcnt, rowmodctr = s.rowmodctr, statblob = s.statblob

FROM sysindexes i

INNER JOIN [tobjects] t ON t.id = i.id

INNER JOIN [tindexes] s ON s.id = t.oid AND s.name = i.name

WHERE (s.status & 64) = 0

GO

Ejecute sp_configure para deshabilitar la actualización de las tablas del sistema en este momento. Cualquier dato necesario para la nueva y pequeña base de datos puede ser transferido en cualquier momento durante este proceso.

Resumen

La descripción de los pasos para transferir las estadísticas de una base a otra ha sido presentada. Esto es, probablemente, más útil cuando es necesario analizar el plan de ejecución que podría ser usado en una base de datos muy grande, desde una pequeña. Los desarrolladores pueden trabajar en la base de datos generada por los scripts, y aún observar el plan de ejecución, con la excepción del paralelismo de ejecución, si el equipo en el cual se desarrolla tiene un solo procesador.

Otro potencial uso es permitir analizar los problemas de performance. Dado que los planes de ejecución pueden ser solamente vistos desde las estadísticas de la base de datos en producción, los scripts para las tablas e índices necesarios pueden ser transferidos a una nueva base de datos conjuntamente con las estadísticas. Este pequeño conjunto de datos puede ser enviado por correo electrónico para analizar problemas en forma remota.

]]>

Leave a comment

Your email address will not be published.