2012-07-02 17 views
5

Estoy trabajando en proporcionar un método para permitir la actualización masiva de nuestras tablas (más de 1M de filas nuevas o actualizadas por actualización) y estaba interesado en eliminar los índices actuales y recrearlos después de las actualizaciones.Caída automática y recreación de índices actuales

Me preguntaba si alguien tiene una secuencia de comandos para proporcionar un acoplamiento flexible de estas operaciones, de modo que si los índices cambian con el tiempo, el proceso de actualización no cambia.

Parece que esta es una de esas cosas que la comunidad ya ha resuelto.

+2

Especifique el RDBMS al que se dirige agregando la etiqueta adecuada (Oracle, SQL Server, MySQL, etc.). Habrá respuestas que aprovechen las características del lenguaje o del producto que no son universalmente compatibles. También al etiquetarlo con un RDBMS específico, su pregunta puede recibir atención de las personas más adecuadas para responder a su pregunta. – Ben

Respuesta

10

Tengo una secuencia de comandos que utilizo para consultar las tablas del sistema para capturar todos los índices no agrupados y luego deshabilitar y reconstruir al finalizar. El siguiente es para usar en la edición estándar, si está en la empresa, agregaría la opción ONLINE.

Desactivar

DECLARE @sql AS VARCHAR(MAX); 
SET @sql = ''; 
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] DISABLE; ' 
FROM sys.indexes AS i 
JOIN sys.objects AS o ON i.object_id = o.object_id 
WHERE i.type_desc = 'NONCLUSTERED' 
AND o.type_desc = 'USER_TABLE' 

EXEC (@sql) 

Reconstruir

DECLARE @sql AS VARCHAR(MAX); 
SET @sql = ''; 
SELECT 
    @sql = @sql + 'ALTER INDEX [' + i.name + '] ON [' + o.name + '] REBUILD WITH (FILLFACTOR = 80); ' 
FROM sys.indexes AS i 
JOIN sys.objects AS o ON i.object_id = o.object_id 
WHERE i.type_desc = 'NONCLUSTERED' 
AND o.type_desc = 'USER_TABLE' 

EXEC (@sql); 

Me gusta este método, ya que es muy personalizable como se puede excluir/incluir ciertas tablas basadas en las condiciones, así como evitar una cursor. También puede cambiar EXEC a PRINT y ver el código que se ejecutará y ejecutará manualmente.

Condición para excluir una mesa

AND o.name NOT IN ('tblTest','tblTest1'); 
+1

¡Impresionante! solo voy a invertir el No IN. Mucho más fácil que la caída y crear lo que estaba tratando de hacer –

+1

También podría usar 'sys.tables' en lugar de' sys.objects' y guardarse para tener que especificar 'WHERE o.type_desc = 'USER_TABLE'' todo el tiempo .... –

4
EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? DISABLE' 

y

EXEC sp_MSforEachTable 'ALTER INDEX ALL ON ? REBUILD' 

es todo lo que necesita si quiere hacerlo para todas las tablas y todos los índices.

+0

Tengo un problema con eso. Las tablas con el índice agrupado deshabilitado no pueden insertar ninguna fila, ya que la tabla se desactiva. – Stoleg

+0

Por favor, pregunte esto como una pregunta independiente. Hay muy poca información ... – fancyPants

+0

'INSERT INTO' falla en una tabla con índice agrupado inhabilitado. Las filas de datos en una tabla con índice agrupado desactivado están disponibles solo para operaciones de descarte o reconstrucción. – Stoleg

Cuestiones relacionadas