SQL Serverでクエリを実行する際の実行時間の予測とそのクエリの問題について

諏訪 大空 0 評価のポイント
2024-05-12T05:07:13.0833333+00:00

以下のクエリコマンドに問題はありますか?またこのクエリを実行せずに、実行時間だけを計る方法はありますか?


USE [test] GO

 

DECLARE @schemaName sysname DECLARE @TableName sysname DECLARE @basesql nvarchar(max), @sql nvarchar(max) ,@sqlmessage nvarchar(max)

 

-- テーブルを再構成するためのベースSQL文 SET @basesql = 'ALTER INDEX ALL ON [@schemaName].[@TableName] REORGANIZE'

 

-- スキーマごとにカーソルを開く DECLARE schemaCursor CURSOR FOR SELECT name FROM sys.schemas WHERE name <> 'sys'

 

OPEN schemaCursor FETCH NEXT FROM schemaCursor INTO @schemaName

 

-- 各スキーマ内のテーブルに対して再構成を行う WHILE @@FETCH_STATUS = 0 BEGIN     -- スキーマ内のテーブルを取得     DECLARE tableCursor CURSOR FOR     SELECT t.name     FROM sys.tables t     INNER JOIN sys.schemas s ON t.schema_id = s.schema_id     WHERE s.name = @schemaName

 

    OPEN tableCursor     FETCH NEXT FROM tableCursor INTO @TableName

 

    -- スキーマ内の各テーブルに対して再構成を実行     WHILE @@FETCH_STATUS = 0     BEGIN         -- インデックスの物理的な統計情報を取得         DECLARE @fragmentation FLOAT         SELECT @fragmentation = avg_fragmentation_in_percent         FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(@schemaName + '.' + @TableName), NULL, NULL, NULL)

 

        -- インデックス断片化率が0%以上の場合に再構成を実行         IF @fragmentation IS NOT NULL AND @fragmentation > 0         BEGIN             -- 再構成の開始メッセージを出力             SET @sqlmessage = @schemaName + '.' + @TableName + ' Reorganize start: ' + CONVERT(varchar, GETDATE(), 21)             RAISERROR(@sqlmessage, 0, 0) WITH NOWAIT

 

            -- テーブル名とスキーマ名を置換して再構成コマンドを実行             SET @sql = REPLACE(REPLACE(@basesql, '@schemaName', @schemaName), '@TableName', @TableName)             EXECUTE (@sql)         END

 

        FETCH NEXT FROM tableCursor INTO @TableName     END

 

    CLOSE tableCursor     DEALLOCATE tableCursor

 

    FETCH NEXT FROM schemaCursor INTO @schemaName END

 

CLOSE schemaCursor DEALLOCATE schemaCursor

 

--- 再構築

 

 

USE [test] GO

 

 

DECLARE @schemaName sysname DECLARE @TableName sysname DECLARE @basesql nvarchar(max), @sql nvarchar(max) ,@sqlmessage nvarchar(max)

 

-- テーブルを再構築するためのベースSQL文 SET @basesql = 'ALTER INDEX ALL ON [@schemaName].[@TableName] REBUILD'

 

-- スキーマごとにカーソルを開く DECLARE schemaCursor CURSOR FOR SELECT name FROM sys.schemas WHERE name <> 'sys'

 

OPEN schemaCursor FETCH NEXT FROM schemaCursor INTO @schemaName

 

-- 各スキーマ内のテーブルに対して再構築を行う WHILE @@FETCH_STATUS = 0 BEGIN     -- スキーマ内のテーブルを取得     DECLARE tableCursor CURSOR FOR     SELECT t.name     FROM sys.tables t     INNER JOIN sys.schemas s ON t.schema_id = s.schema_id     WHERE s.name = @schemaName

 

    OPEN tableCursor     FETCH NEXT FROM tableCursor INTO @TableName

 

    -- スキーマ内の各テーブルに対して再構築を実行     WHILE @@FETCH_STATUS = 0     BEGIN         -- インデックスの物理的な統計情報を取得         DECLARE @fragmentation FLOAT         SELECT @fragmentation = avg_fragmentation_in_percent         FROM sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(@schemaName + '.' + @TableName), NULL, NULL, NULL)

 

        -- インデックス断片化率が30%以上の場合に再構築を実行         IF @fragmentation IS NOT NULL AND @fragmentation > 30         BEGIN             -- 再構築の開始メッセージを出力             SET @sqlmessage = @schemaName + '.' + @TableName + ' Rebuild start: ' + CONVERT(varchar, GETDATE(), 21)             RAISERROR(@sqlmessage, 0, 0) WITH NOWAIT

 

            -- テーブル名とスキーマ名を置換して再構築コマンドを実行             SET @sql = REPLACE(REPLACE(@basesql, '@schemaName', @schemaName), '@TableName', @TableName)             EXECUTE (@sql)         END

 

        FETCH NEXT FROM tableCursor INTO @TableName     END

 

    CLOSE tableCursor     DEALLOCATE tableCursor

 

    FETCH NEXT FROM schemaCursor INTO @schemaName END

 

CLOSE schemaCursor DEALLOCATE schemaCursor

SQL Server
SQL Server
Microsoft リレーショナル データベース管理分析システムのファミリで、電子商取引、基幹業務、データ ウェアハウジングなどのソリューションで使用されています。
22 件の質問
0 件のコメント コメントはありません
{count} 件の投票