web-dev-qa-db-fra.com

Comment utiliser MSSQL, reconstruisez tous les index sur toutes les tables? Server MSSQL 2008

J'ai une base de données MSSQL, nous l'appellerons: MSSQLDB01. J'ai été chargé d'effectuer une défragmentation sur toutes les tables. Cette base de données comporte quelques centaines de tables et chaque table dispose d'une gamme de 1 à 15 index par table.


[.____] Google m'a conduit à découvrir une pratique pour défrasser tous les index par table, mais je ne peux pas comprendre comment le faire sur toutes les tables.

ALTER INDEX ALL ON TABLENAME REBUILD;

ce que je cherche, c'est

ALTER INDEX ALL ON * REBUILD; 

mais il se plaint

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '*'.`

ci-dessous me laisse trouver toutes les tables de mon dB

SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'

puis-je appuyer sur cela dans la commande?

ALTER INDEX ALL ON (SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'; ) REBUILD;
6
parsecpython

Vous pouvez probablement écrire un script qui utilise Dynamic SQL pour le faire, mais pourquoi le faire quand vous pouvez utiliser quelqu'un d'autre? Ola Hallengren's sont les plus connus et gratuits, mais Minion Ware dispose également d'un script Reindex gratuit .

Si vous insistez pour l'écrire vous-même, quelque chose comme cela pourrait fonctionner:

Use mssqlDB01

Declare @TBname nvarchar(255),
        @SQL nvarchar(max) 


select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

while @TBname is not null

BEGIN
    set @SQL='ALTER INDEX ALL ON [' + @TBname + '] REBUILD;'
    --print @SQL
    EXEC SP_EXECUTESQL @SQL
    select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_NAME > @TBname          
END
11
Katherine Villyard
  1. Appuyez sur Ctrl + T
  2. Exécutez cette requête:

    SELECT 'ALTER INDEX ALL ON ' + table_name + '  REBUILD;' 
        FROM Information_Schema.tables where  table_type ='BASE TABLE'
    
  3. Copiez la sortie et collez-la dans la fenêtre SQL, puis cliquez sur Exécuter.

3
Firdaus

Construire sur @firdaus Nice and Simple Réponse :

Si votre base de données a des schémas, essayez d'exécuter ce qui suit dans SSMS:

SELECT 'ALTER INDEX ALL ON ' + TABLE_SCHEMA + '.' + table_name + '  REBUILD;' 
    FROM Information_Schema.tables where  table_type ='BASE TABLE'
1
Aron

Cela reconstruira les index et conservera les paramètres de compression si vous en avez:

DECLARE
    @schemaName sysname,
    @tableName sysname,
    @compressionType VARCHAR(50),
    @sql NVARCHAR(1000)

DECLARE table_cursor CURSOR FAST_FORWARD
FOR
SELECT
    SCHEMA_NAME(t.schema_id) AS SchemaName,
    t.name AS TableName,
    p.data_compression_desc AS CompressionType
FROM
    sys.partitions AS p
    INNER JOIN sys.tables AS t ON t.object_id = p.object_id
WHERE
    p.index_id IN (0, 1)

OPEN table_cursor

FETCH NEXT FROM table_cursor
INTO @schemaName, @tableName, @compressionType

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'ALTER INDEX ALL ON [' + @schemaName + '].[' + @tableName + '] REBUILD'
        + CASE WHEN @compressionType <> 'NONE' 
            THEN ' PARTITION = ALL WITH(DATA_COMPRESSION = ' + @compressionType + ')'
            ELSE ''
          END

    PRINT @sql
    EXEC sys.sp_executesql @SQL

    FETCH NEXT FROM table_cursor   
    INTO @schemaName, @tableName, @compressionType
END

CLOSE table_cursor;  
DEALLOCATE table_cursor;  
0
Vedran