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;
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
Exécutez cette requête:
SELECT 'ALTER INDEX ALL ON ' + table_name + ' REBUILD;'
FROM Information_Schema.tables where table_type ='BASE TABLE'
Copiez la sortie et collez-la dans la fenêtre SQL, puis cliquez sur Exécuter.
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'
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;