web-dev-qa-db-ja.com

MSSQLを使用して、すべてのテーブルのすべてのインデックスを再構築する方法MSSQL Server 2008

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;
6
parsecpython

おそらく、それを行うために動的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
11
  1. Ctrl + Tを押す
  2. このクエリを実行します。

    SELECT 'ALTER INDEX ALL ON ' + table_name + '  REBUILD;' 
        FROM Information_Schema.tables where  table_type ='BASE TABLE'
    
  3. 出力をコピーしてSQLウィンドウに貼り付け、[実行]をクリックします。

3
Firdaus

@ Firdausをベースにした、素朴でシンプルな答え:

データベースにスキーマがある場合は、SSMSで次のコマンドを実行してみてください。

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

これにより、インデックスが再構築され、圧縮設定が保持されます。

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