Mssqlデータベースがあります。これをmssqlDB01と呼びます。すべてのテーブルで最適化を実行する必要があります。このデータベースには数百のテーブルがあり、各テーブルにはテーブルごとに1〜15のインデックスの範囲があります。
Googleのおかげで、テーブルごとにすべてのインデックスをデフラグする方法を見つけましたが、すべてのテーブルでそれを行う方法がわかりません。
ALTER INDEX ALL ON TABLENAME REBUILD;
私が探しているのは
ALTER INDEX ALL ON * REBUILD;
しかしそれは不平を言う
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '*'.`
以下では、DB内のすべてのテーブルを検索できます
SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'
どういうわけかこれをコマンドにプッシュできますか?
ALTER INDEX ALL ON (SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'; ) REBUILD;
おそらく、それを行うために動的SQLを使用するスクリプトを書くことができますが、他の誰かのスクリプトを使用できるのに、なぜそうするのでしょうか。 Ola Hallengren's は最もよく知られていて無料ですが、 Minion Wareにも無料の再インデックススクリプトがあります 。
あなたがそれを自分で書くことを主張するなら、このようなものがうまくいくかもしれません:
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
このクエリを実行します。
SELECT 'ALTER INDEX ALL ON ' + table_name + ' REBUILD;'
FROM Information_Schema.tables where table_type ='BASE TABLE'
出力をコピーしてSQLウィンドウに貼り付け、[実行]をクリックします。
@ Firdausをベースにした、素朴でシンプルな答え:
データベースにスキーマがある場合は、SSMSで次のコマンドを実行してみてください。
SELECT 'ALTER INDEX ALL ON ' + TABLE_SCHEMA + '.' + table_name + ' REBUILD;'
FROM Information_Schema.tables where table_type ='BASE TABLE'
これにより、インデックスが再構築され、圧縮設定が保持されます。
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;