SQL Serverでクエリを実行する際の実行時間の予測とそのクエリの問題について
以下のクエリコマンドに問題はありますか?またこのクエリを実行せずに、実行時間だけを計る方法はありますか?
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