Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

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 TABLEALTER TABLE 文の、PRIMARY KEY や UNIQUE オプションを使用して個別に作成された) インデックスには適用されません。

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

  • テーブルに対して頻繁に INSERTUPDATEDELETE を実行する必要がある場合。このような各操作でインデックスに書き込みが行われ、パフォーマンスのオーバーヘッドが増加する場合は、各操作に %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 エラーを発行します。ただし、構成オプションを以下のように設定することにより、システム全体でこの既定の設定をオーバーライドできます。

既定値は “いいえ” (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

関連項目

FeedbackOpens in a new tab