DROP INDEX
Synopsis
DROP INDEX index-name [ON [TABLE] [schema-name.]table-name] DROP INDEX [schema-name.]table-name.index-name
引数
index-name | 削除するインデックスの名前。index-name は標準のインデックスまたはビットマップ・インデックスのいずれかです。 |
ON table-name
またはON TABLE table-name |
オプション — インデックスが関連付けられているテーブルの名前。table-name は前述のいずれかの構文で指定できます。最初の構文は ON 節を使用しています。TABLE キーワードはオプションです。2 番目の構文は修飾付きの名前構文 (schema-name.table-name.index-name) を使用しています。テーブルのスキーマ名はオプションです。table-name を省略した場合、Caché は、以下に説明するように index-name に最初に一致したインデックスを削除します。 |
概要
DROP INDEX 文はインデックスを削除します。DROP INDEX は、PRIMARY KEY や UNIQUE 制約の定義によって作成された (CREATE TABLE や ALTER TABLE 文の、PRIMARY KEY や UNIQUE オプションを使用して個別に作成された) インデックスには適用されません。
インデックスを削除する理由には、次のようなものがあります。
-
テーブルに対して頻繁に INSERT、UPDATE、DELETE を実行する必要がある場合。このような各操作でインデックスに書き込みが行われ、パフォーマンスのオーバーヘッドが増加する場合は、各操作に %NOINDEX オプションを使用することができます。または、状況によっては、インデックスを削除し、データベースへの変更を一括して行った後、インデックスを再作成および生成する方法もあります。
-
クエリ操作に使用されないフィールド、またはフィールドの組み合わせにインデックスが存在する場合。この場合、インデックスをメンテナンスするパフォーマンスのオーバーヘッドがあまり大きくない場合があります。
-
現在、重複するデータが大量に含まれているフィールドまたはフィールドの組み合わせにインデックスが存在する場合。この場合、クエリのパフォーマンスはあまり改善されない場合があります。
IDKEY インデックスは、テーブルにデータがあるときは削除できません。これを実行しようとすると、SQLCODE -325 エラーが生成されます。
特権とロック
DROP INDEX コマンドは特権を必要とする操作です。DROP INDEX を使用する前に、%ALTER_TABLE 管理者特権または指定されたテーブルに対する %ALTER 特権があることを確認する必要があります。特権がない場合は、SQLCODE -99 エラー (特権違反) が返されます。%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが %ALTER 特権を持っているかどうかを確認できます。$SYSTEM.SQL.CheckPriv()Opens in a new tab メソッドを呼び出すことにより、指定のユーザが %ALTER 特権を持っているかどうかを確認できます。適切な特権を持っている場合は、GRANT コマンドを使用してこのような特権を割り当てることができます。
DROP INDEX は、テーブル・クラスの定義に [DdlAllowed] が含まれている場合を除き、永続クラスを定義して作成したテーブルでは使用できません。使用すると、操作は SQLCODE -300 エラーで失敗し、%msg が “DDL がクラス schema.tablename に対して有効になっていません” に設定されます。
DROP INDEX 文は、table-name に対してテーブル・レベルのロックを取得します。これにより、他のプロセスはこのテーブルのデータを変更できなくなります。このロックは、DROP INDEX 操作が終了すると自動的に解除されます。
インデックス名とテーブル名
インデックスを作成するために index-name を指定すると、システムは対応するクラス・インデックス名を句読点を削除して生成し、指定した index-name をインデックスの SqlName 値としてクラスに保持します。
インデックスに関連するテーブルは、以下の DROP INDEX 構文形式を使用して指定できます。
-
index-name ON TABLE 構文 : テーブル名の指定はオプションです。省略した場合、Caché はネームスペース内のすべてのクラスから、対応するインデックスを検索します。
-
table-name.index-name 構文 : テーブル名の指定は必須です。
どちらの構文でも、テーブル名は未修飾 (table) または修飾 (schema.table) のいずれでもかまいません。スキーマ名を省略すると、システム全体の既定のスキーマが使用されます。
DROP INDEX でテーブル名が指定されていない場合、Caché は index-name と一致するインデックス SqlName のすべてのインデックス、またはインデックスに対して SqlName が指定されていない場合はインデックスの index-name と一致するインデックス名のすべてのインデックスを検索します。Caché がどのクラスでも一致するインデックスを検出しなかった場合、そのようなインデックスが存在しないことを示す SQLCODE -333 エラーが発生します。一致するインデックスを Caché が複数検出した場合、削除するインデックスを DROP INDEX が決定できないため、SQLCODE -334 エラー ("インデックス名があいまいです。複数のテーブルでインデックスが検出されました。") が発生します。Caché のインデックス名は、ネームスペースごとに一意ではありません。
存在しないインデックス
存在しないインデックスを削除しようとすると、DROP INDEX は既定で SQLCODE -333 エラーを発行します。ただし、構成オプションを以下のように設定することにより、システム全体でこの既定の設定をオーバーライドできます。
-
$SYSTEM.SQL.SetDDLNo333()Opens in a new tab メソッド呼び出し。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[SQLCODE=-333 エラーの抑制] の設定が表示されます。
-
管理ポータルに進み、システム, 構成, 一般SQL設定 を選択します。[Allow DDL DROP of Non-existent Index] の現在の設定を表示します。
既定値は “いいえ” (0) です。既定では、Caché は SQLCODE -333 エラーを返します。この設定を推奨します。存在しないインデックスに対して DROP INDEX の処理をせず、エラー・メッセージも発行しない場合は、“はい” (1) に設定します。詳細は、"Caché 詳細構成設定リファレンス" で説明されている SQL 構成設定を参照してください。
テーブル名
オプションの table-name を指定する場合は、既存のテーブルに対応している必要があります。
-
指定した table-name が存在しない場合、Caché は SQLCODE -30 エラーを発行し、%msg が "テーブルの 'SQLUser.tname' は存在しません" に設定されます。
-
指定した table-name は存在するけれども index-name という名前のインデックスがない場合、Caché は SQLCODE -333 エラーを発行し、%msg が "テーブル SQLUSER.TNAME 上の DROP INDEX 'MyIndex' への試みが失敗しました。インデックスが見つかりません。" に設定されます。
-
指定した table-name がビューの場合、Caché は SQLCODE -333 エラーを発行し、%msg が "ビュー SQLUSER.VNAME 上の DROP INDEX 'EmpSalaryIndex' への試みは失敗しました。" に設定されます。インデックスは、ビューではなく、テーブルに対してのみサポートされています。
例
最初の例では、Employee という名前のテーブルを作成しています。これは、このセクションのすべての例で使用されます。
以下の埋め込み SQL 例は、"EmpSalaryIndex" という名前のインデックスを作成し、後でそれを削除します。この例の DROP INDEX では、インデックスに関連付けられているテーブルが指定されておらず、このネームスペース内で "EmpSalaryIndex" が一意のインデックス名であると想定されています。
&sql(CREATE TABLE Employee (
EMPNUM INT NOT NULL,
NAMELAST CHAR(30) NOT NULL,
NAMEFIRST CHAR(30) NOT NULL,
STARTDATE TIMESTAMP,
SALARY MONEY,
ACCRUEDVACATION INT,
ACCRUEDSICKLEAVE INT,
CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM))
)
WRITE !,"SQLCODE=",SQLCODE," Created a table"
&sql(CREATE INDEX EmpSalaryIndex
ON TABLE Employee
(Namelast,Salary))
WRITE !,"SQLCODE=",SQLCODE," Created an index"
/* use the index */
NEW SQLCODE,%msg
&sql(DROP INDEX EmpSalaryIndex)
WRITE !,"SQLCODE=",SQLCODE," Deleted an index"
WRITE !,"message",%msg
以下の埋め込み SQL の例では、ON TABLE 節を使用して、削除するインデックスに関連付けられているテーブルを指定しています。
&sql(CREATE INDEX EmpVacaIndex
ON TABLE Employee
(NameLast,AccruedVacation))
WRITE !,"SQLCODE=",SQLCODE," Created an index"
/* use the index */
&sql(DROP INDEX EmpVacaIndex ON TABLE Employee)
WRITE !,"SQLCODE=",SQLCODE," Deleted an index"
以下の埋め込み SQL の例では、修飾付きの名前構文を使用して、削除するインデックスに関連付けられているテーブルを指定しています。
&sql(CREATE INDEX EmpSickIndex
ON TABLE Employee
(NameLast,AccruedSickLeave))
WRITE !,"SQLCODE=",SQLCODE," Created an index"
/* use the index */
&sql(DROP INDEX Employee.EmpSickIndex)
WRITE !,"SQLCODE=",SQLCODE," Deleted an index"
以下のコマンドは、存在しないインデックスを削除しようとしています。そのため、SQLCODE -333 エラーが生成されます。
DROP INDEX PeopleIndex ON TABLE Employee
関連項目
-
“Caché SQL 最適化ガイド” の “インデックスの定義と構築” の章
-
"Caché エラー・リファレンス" にリストされた SQLCODE エラー・メッセージ