SQL Server Management Studioで大きなサイズのテーブルのインデックスを作成するとタイムアウトエラーが発生する - SQL Server

SQL Server Management Studioで大きなサイズのテーブルのクラスタ化インデックスを作成するとタイムアウトエラーが発生する現象を紹介します。

現象

SQL Server Management Studioのオブジェクトエクスプローラのテーブルのノードの[インデックス]ノードで右クリックし表示されるポップアップメニューの[新しいインデックスの作成]からインデックスを作成します。


下図のインデックス作成ダイアログが表示されます。


インデックスの作成を開始します。


エラーが発生します。ダイアログ左下の[進行状況]欄のエラーメッセージのリンクをクリックします。


下図のエラーメッセージが表示されます。
エラーメッセージ
インデックス '(インデックス名)' の作成に失敗しました。(Microsoft.SqlServer.Smo)
詳細
  → Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。(Microsoft.SqlServer.ConnectionInfo)
    → 実行タイムアウトの期限が切れました。操作完了前にタイムアウト期間が過ぎたか、サーバーが応答していません。
      ステートメントは終了されました。(Microsoft SQL Server)
        → 待ち操作がタイムアウトになりました。

原因

インデックスの作成に時間がかかりすぎるため、タイムアウトになってしまっていると考えられます。特にクラスタ化インデックスを作成する場合はレコードの物理的な順番の入れ替えが発生するため、タイムアウトになるケースが増します。

対処法

2つの対処法があります。

1. テーブルを空にして、インデックス作成後データを再投入する

テーブルにデータを再投入できる場合に限りますが、一度テーブルのレコードをすべて削除して、インデックスを作成してから再度テーブルにレコードを挿入する方法です。

手順

TRUNCATE TABLE (テーブル名);
  1. コマンドを実行してすべてのレコードを削除します。TRUNCATE TABLE の詳細はこちらの記事を参照してください。
  2. レコードがすべて削除されたのち、先と同様の手順で、SQL Server Management Studioのオブジェクトエクスプローラから[新しいインデックスの作成]でインデックスを作成します。レコードが1件もないためすぐにインデックスが作成できます。
  3. テーブルに再度レコードを追加します。

2.SQL コマンドを実行する

SQL Server Management Studioの[新しいインデックスの作成]で開かれるダイアログでインデックスを作成するとエラーが発生しますが、インデックス作成のクエリをSQL Server Management Studioから実行した場合は先のタイムアウトエラーは発生しません。SQLによるインデックス作成はこちらの記事を参照してください。

タイムアウトエラーが発生せずに、インデックス作成のSQLが実行できました。(ただし、テーブルのレコード数が多い場合は、非常に長い時間がかかります。)


著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2024-01-07
作成日: 2018-02-19
iPentec all rights reserverd.