Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

BUILD INDEX (SQL)

1 つ以上のインデックスにデータを入力します。

Synopsis

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

引数

FOR TABLE table-name 既存のテーブルの名前。table-name は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。テーブル名が未修飾の場合は、既定のスキーマ名が使用されます。
INDEX index-name オプション — インデックスの SqlName、またはインデックス SqlName のコンマ区切りリスト。指定した場合、指定したインデックスのみが構築されます。指定しない場合、テーブルに定義されているすべてのインデックスが構築されます。
FOR SCHEMA schema-name 既存のスキーマの名前。このコマンドは、指定されたスキーマ内のすべてのテーブルのすべてのインデックスを構築します。

説明

BUILD INDEX には、定義されているすべてのインデックスを構築/再構築するための 3 つの構文形式が用意されています。

  • テーブル : BUILD INDEX FOR TABLE table-name。オプションの INDEX 節を使用すると、指定したインデックスのみを構築/再構築できます。

  • スキーマ内のすべてのテーブル : BUILD INDEX FOR SCHEMA schema-name

  • 現在のネームスペース内のすべてのテーブル : BUILD INDEX FOR ALL

インデックスを構築する理由には、次のようなものがあります。

  • CREATE INDEX を使用して、すでにデータを含むテーブルに 1 つ以上のインデックスを追加した場合。

  • INSERTUPDATE、または DELETE の各操作でインデックスに書き込むことによるパフォーマンス・オーバーヘッドを受け入れるのではなく、%NOINDEX オプションを使用して各操作をテーブルに対して実行した場合。

どちらの場合も、BUILD INDEX を使用してこれらのインデックスにデータを入力します。

BUILD INDEX は、変更されたテーブルの数を、影響を受けた行数として返します。

ObjectScript を利用して定義したクラスは、スーパークラスから構築する必要のあるインデックスを継承することがあります。このような "継承された" インデックスを構築するには、そのインデックスを定義しているスーパークラスに対して BUILD INDEX を呼び出す必要があります。そのインデックスを使用するサブクラスに対して呼び出すのではありません。

テーブルで %Storage.SQL を使用する場合、そのクラスで明示的に定義したインデックスは構築されません。

特権

BUILD INDEX コマンドは特権を必要とする操作です。BUILD INDEX を実行するには、ユーザは %BUILD_INDEX 管理特権を持っている必要があります。持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザ 'name' は %BUILD_INDEX 特権を持っていません" に設定されます。適切な付与特権を持っていれば、GRANT コマンドを使用して、ユーザまたはロールに %BUILD_INDEX 特権を割り当てることができます。管理特権はネームスペース固有のものです。詳細は、"InterSystems SQL の使用法" の "特権" を参照してください。

ユーザは、指定されたテーブルに対する SELECT 特権を持っている必要があります。ユーザがテーブルの所有者 (作成者) である場合、ユーザにはそのテーブルに対する SELECT 特権が自動的に付与されます。そうでない場合は、ユーザにテーブルに対する SELECT 特権を付与する必要があります。

  • 指定したテーブルに対する SELECT 特権がない場合に BUILD INDEX FOR TABLE を発行すると、SQLCODE –30 エラーが発生し、%msg が "テーブル 'name' が見つかりません" に設定されます。

  • BUILD INDEX FOR SCHEMA を発行すると、ユーザが SELECT 特権を持つテーブルについてのみインデックスが構築されます。ユーザがスキーマ内のどのテーブルに対する SELECT 特権も持っていない場合、コマンドはエラーなしで完了し、影響を受ける列は 0 となります。

%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが SELECT 特権を持っているかどうかを確認できます。GRANT コマンドを使用して、指定したテーブルに SELECT 特権を割り当てることができます。詳細は、"InterSystems SQL の使用法" の "特権" を参照してください。

ロックとジャーナリング

既定では、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" に設定されます。

関連項目

FeedbackOpens in a new tab