BUILD INDEX (SQL)
構文
BUILD INDEX [%NOLOCK] [%NOJOURN] FOR TABLE table-name
[INDEX index-name [,index-name]]
BUILD INDEX [%NOLOCK] [%NOJOURN] FOR SCHEMA schema-name
BUILD INDEX [%NOLOCK] [%NOJOURN] FOR ALL
説明
BUILD INDEX には、定義されているすべてのインデックスを構築/再構築するための 3 つの構文形式が用意されています。
-
テーブル : BUILD INDEX FOR TABLE table-name。オプションの INDEX 節を使用すると、指定したインデックスのみを構築/再構築できます。
-
スキーマ内のすべてのテーブル : BUILD INDEX FOR SCHEMA schema-name
-
現在のネームスペース内のすべてのテーブル : BUILD INDEX FOR ALL
インデックスを構築する理由には、次のようなものがあります。
-
CREATE INDEX を使用して、既にデータを含むテーブルに 1 つ以上のインデックスを追加した場合。
-
INSERT、UPDATE、または DELETE の各操作でインデックスに書き込むことによるパフォーマンス・オーバーヘッドを受け入れるのではなく、%NOINDEX オプションを使用して各操作をテーブルに対して実行した場合。
どちらの場合も、BUILD INDEX を使用してこれらのインデックスにデータを入力します。
BUILD INDEX は、変更されたテーブルの数を、影響を受けた行数として返します。
DEFER BUILD オプションと共に CREATE INDEX を使用してインデックスを作成した場合、インデックスは手動で構築する必要があります。BUILD INDEX はインデックスのデータを構築しますが、クエリでそのインデックスを選択可能、または使用可能にするわけではないことに注意してください。インデックスを選択可能にするには、SetMapSelectability()Opens in a new tab メソッドを使用します。マップが選択可能かどうかを管理ポータルで表示するには、[システムエクスプローラ]→[SQL]→[カタログの詳細] に移動し、[マップ]/[インデックス] ボタンを選択します。
ObjectScript を利用して定義したクラスは、スーパークラスから構築する必要のあるインデックスを継承することがあります。このような "継承された" インデックスを構築するには、そのインデックスを定義しているスーパークラスに対して BUILD INDEX を呼び出す必要があります。そのインデックスを使用するサブクラスに対して呼び出すのではありません。
テーブルで %Storage.SQL を使用する場合、そのクラスで明示的に定義したインデックスは構築されません。
特権
BUILD INDEX コマンドは特権を必要とする操作です。BUILD INDEX を実行するには、ユーザは %BUILD_INDEX 管理特権を持っている必要があります。持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザ 'name' は %BUILD_INDEX 特権を持っていません" に設定されます。適切な付与特権を持っていれば、GRANT コマンドを使用して、ユーザまたはロールに %BUILD_INDEX 特権を割り当てることができます。管理特権はネームスペース固有のものです。詳細は、"特権" を参照してください。
ユーザは、指定されたテーブルに対する SELECT 特権を持っている必要があります。ユーザがテーブルの所有者 (作成者) である場合、ユーザにはそのテーブルに対する SELECT 特権が自動的に付与されます。そうでない場合は、ユーザにテーブルに対する SELECT 特権を付与する必要があります。
-
指定したテーブルに対する SELECT 特権がない場合に BUILD INDEX FOR TABLE を発行すると、SQLCODE –30 エラーが発生し、%msg が "テーブル 'name' が見つかりません" に設定されます。
-
BUILD INDEX FOR SCHEMA を発行すると、ユーザが SELECT 特権を持つテーブルについてのみインデックスが構築されます。ユーザがスキーマ内のどのテーブルに対する SELECT 特権も持っていない場合、コマンドはエラーなしで完了し、影響を受ける列は 0 となります。
%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが SELECT 特権を持っているかどうかを確認できます。GRANT コマンドを使用して、指定したテーブルに SELECT 特権を割り当てることができます。詳細は、"特権" を参照してください。
ロックとジャーナリング
既定では、BUILD INDEX 文はインデックスを構築する前に各テーブルのエクステント・ロックを取得します。これにより、他のプロセスはこのテーブルのデータを変更できなくなります。このロックは、BUILD INDEX 操作が終了すると自動的に解除されます。%NOLOCK を指定して、テーブルのロックを防ぐことができます。
既定では、BUILD INDEX 文は現在のプロセスのジャーナル設定を使用します。%NOJOURN を指定して、ジャーナリングを防ぐことができます。
%NOLOCK または %NOJOURN を使用するには、対応する SQL 管理特権が必要です。この特権は、GRANT コマンドを使用して設定できます。
エラー・コード
-
指定した table-name が存在しない場合、InterSystems IRIS は SQLCODE -30 エラーを発行し、%msg が "テーブル 'sample.tname' が存在しません" に設定されます。このエラー・メッセージが返されるのは、テーブルではなくビューを指定した場合、または SELECT 特権を持たないテーブルを指定した場合です。
-
指定した index-name が存在しない場合、InterSystems IRIS は SQLCODE -400 エラーを発行し、%msg が "エラー #5066: インデックス名 'sample.tname::badindex' が正しくありません" に設定されます。
-
指定した schema-name が存在しない場合、InterSystems IRIS は SQLCODE -473 エラーを発行し、%msg が "Schema 'sample' not found" に設定されます。
引数
FOR TABLE table-name
既存のテーブルの名前。table-name は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。テーブル名が未修飾の場合は、既定のスキーマ名が使用されます。
INDEX index-name
インデックス名、またはコンマで区切った複数のインデックス名 (オプション)。指定した場合、指定したインデックスのみが構築されます。指定しない場合、テーブルに定義されているすべてのインデックスが構築されます。
FOR SCHEMA schema-name
既存のスキーマの名前。このコマンドは、指定されたスキーマ内のすべてのテーブルのすべてのインデックスを構築します。