[[FrontPage]]へ~
-[[リファレンスガイド]]へ~
--[[Firebird SQLリファレンス]]へ~
&br;
----
*Firebird SQLリファレンス:CREATE INDEX, ALTER INDEX, DROP INDEX, SET STATISTICS [#u6cd3bf5]

#contents

----
&br;
&aname(create_index);
*CREATE INDEX [#w7c19b46]
 1つのテーブルに対して、1つまたはいくつかの列によるインデックスを作成
します。
SQL,DSQL,isql で使用できます。~

**構文 [#racd150e]

 CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX index
     ON table (col [, col …]);

&br;
※ DSQLで使用する場合、終端文字のセミコロンは不要です。
isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
&br;
&br;

|引数|説明|h
|UNIQUE|インデックス付きの列に対してインサートやアップデートを行うとき、同値の列が存在できないようにします。|
|ASC[ENDING]|ソートが昇順で行われます。省略時のデフォルトです。|
|DESC[ENDING]|ソートが降順で行われます。|
|index|データベースで一意なインデックス名です。|
|table|インデックスを作成するテーブルの名前です。|
|col|テーブルに存在する列名です。|
&br;

**詳細の説明 [#e30422dc]
 CREATE INDEX により、テーブルの1つまたはいくつかの列に対するインデックス
を作成します。これにより、データアクセスの速度が向上します。特に、WHERE の
検索条件で指定する列に対して使用すると、検索性能が向上する可能性があります。~
(訳注:格納されたデータ数(行数)が少ないテーブルに対しては、大きな効果は期待
できません。)~
&br;
 BLOBや、配列の列にはインデックスは使用できません。~
&br;
 指定した列や列群の列データ中に、すでに同値の列がある場合やNULL値の列がある
場合には、UNIQUE を指定してインデックスを作成することは出来ません。~
&br;
 ASCやDESCの指定により、インデックスのソートを行うことが出来ます。これにより
、ORDER BY によるソートを伴うクエリの検索性能が向上します。また、同じ列や列群
に対し、ASC,DESC の指定が異なるインデックスを別々に作成することも出来ます。~
&br;
 インデックスによる性能向上を図るために、SET STATISTICS によってインデックス
の再計算を行うことが出来ます。また、ALTER INDEX を使用してインデックスの
非活性化と活性化を連続して行うことにより、インデックスを再作成できます。~
&br;
(訳注 : UNIQUE、PRIMARY KEY、FOREIGN KEYなどを定義した列に対してはシステム
が自動的にインデックスを作成します。そのため、通常はそれらの列のみで構成
されたインデックスをユーザーが作成する必要はあまりありません。)~
&br;

**用例 [#m4156262]
 用例は、すべて isqでの例です。
&br;
-UNIQUEインデックスを作成します。

 CREATE UNIQUE INDEX PRODTYPEX ON PROJECT (PRODUCT, PROJ_NAME);

&br;
-降順のインデックスを作成します。

 CREATE DESCENDING INDEX CHANGEX ON SALARY_HISTORY (CHANGE_DATE);

&br;
-2つの列を指定してインデックスを作成します。

 CREATE INDEX NAMEX ON EMPLOYEE (LAST_NAME, FIRST_NAME);

&br;
**参照 [#eafee5e7]
 [[ALTER INDEX>#alter_index]] , [[DROP INDEX>#drop_index]] , [[SELECT]] ,
[[SET STATISTICS>#set_statistics]]~

&br;
&br;
----
&br;
&br;
&aname(alter_index);
*ALTER INDEX [#k22725fc]
 インデックスを活性化または非活性化します。
SQL, DSQL, isql で使用できます~

**用例 [#m4c1c0f4]

 ALTER INDEX name {ACTIVE | INACTIVE};

&br;
※ DSQLで使用する場合、終端文字のセミコロンは不要です。
isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
&br;
&br;

|引数|説明|h
|name|既存のインデックス名を指定します。|
|ACTIVE|非活性状態なインデックスを活性化します。|
|INACTIVE|活性状態なインデックスを非活性化します。|
&br;

**詳細の説明 [#a8956405]
 ALTER INDEX により、非活性のインデックスを活性化、または活性化している
インデックスを無効(非活性化)できます。インデックスが付いたデータの変更等に
よりインデックスが不適当な状態になった時に、一度非活性化したのちに活性化
することは非常に有益です。~
&br;
 テーブルに対して多数の行をインサートやアップデートする場合、インデックス
の逐次増加を防ぐために、そのテーブルのインデックスを一度不活性化するべき
です。そして、すべての変更が終わった後に、インデックスを活性化します。
不活性なインデックスを活性化すると、インデックスの再作成が行われ、適正な
インデックスが再構築されます。~
&br;
 指定したインデックスが(他のアクセスにより)使用中である場合、その使用が
終了するまで ALTER INDEX の実行は延期されます。~
&br;
 ALTER INDEX がエラーを返すのは、そのインデックス(訳注:で指定した列?)に
UNIQUE、PRIMARY KEY、FOREIGN KEY 制約が定義されている場合です。そのような
インデックスの場合には、DROP INDEX で削除した後に、CREATE INDEX で再作成を
行う必要があります。~
&br;
 インデックスに対する ALTER INDEX の使用は、作成者、SYSDBAユーザーおよび
OSのルート権限を持つユーザーのみが可能です。~
&br;
※インデックスの列やキーの削除や追加を行うには、DROP INDEX で削除を行った
後に、(新しい指定で)CREATE INDEX により再作成を行う必要があります。~
&br;

**用例 [#p1afc7ae]
 isql で、非活性化・活性化を連続して行う例です。(インデックス再構築)

 ALTER INDEX BUDGETX INACTIVE;
 ALTER INDEX BUDGETX ACTIVE;

&br;
**参照 [#k1deb6a0]
 ALTER TABLE , [[CREATE INDEX>#create_index]] , [[DROP INDEX>#drop_index]] ,
[[SET STATISTICS>#set_statistics]]~



&br;
&br;
----
&br;
&br;
&aname(drop_index);
*DROP INDEX [#p757dfe6]
 インデックスをデータベースから削除します。
SQL,DSQL,isql で使用可能です。~


**構文 [#l4b745cf]

 DROP INDEX name;

&br;
※ DSQLで使用する場合、終端文字のセミコロンは不要です。
isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
&br;
&br;

|引数|説明|h
|name|既存のインデックス名を指定します。|
&br;

**詳細の説明 [#w3136324]
 DROP INDEX により、ユーザーが定義したインデックスをデータベースから削除
できます。~
&br;
 インデックスを削除できるのは、作成者、SYSDBAユーザーおよびOSのルート権限
を持つユーザーのみです。~
&br;
''重要''~
 UNIQUE、PRIMARY KEY、FOREIGN KEYなどでシステムが定義したインデックスを削除
することは出来ません。~
 また、使用中のインデックスを削除しようとすると、その使用が終了するまで削除
は行われません。~


**用例 [#e36f42c0]
 isql でインデックスの削除を行う例です。

 DROP INDEX MINSALX;
&br;

** 参照 [#e0860c38]
 [[ALTER INDEX>#alter_index]] , [[CREATE INDEX>#create_index]]~

&br;
 これ以上の情報が欲しい場合、Data Definition Guide の integrity constraints
と system-defined indexes を参照して下さい。~



&br;
&br;
----
&br;
&br;
&aname(set_statistics);
*SET STATISTICS [#r8363c5c]
 指定されたインデックスの選択性に関する再計算を行います。
SQL,DSQL,isqlで使用できます。~


**構文 [#w79bf94b]

 SET STATISTICS INDEX name;

&br;
※ DSQLで使用する場合、終端文字のセミコロンは不要です。
isql及びC/C++の埋め込みSQLでは行の終わりを示すために終端文字は必要です。
&br;
&br;

|引数|説明|h
|name|既存のインデックス名を指定します。|
&br;

**詳細の説明 [#j1deacb2]
 SET STATISTICS により、インデックスの選択性が再計算されます。~
インデックスの選択性の計算は、明白にテーブルに格納されたデータの行数がベースと
なっています。それは、テーブルへのアクセス時に、データベースエンジンの
オプティマイザによって作成されます。それはメモリ上にキャッシュされ、
クエリに最適の検索プランを計算するためのオプティマイザがアクセスします。
インデックスが付いた列の複製が急激に増加もしくは減少するテーブルの場合には、
これで定期的に再計算を行うことにより、パフォーマンスが向上します。~
&br;
 SET STATISTICS は、インデックスの作成者のみが使用できます。~
&br;
※ SET STATISTICS は、インデックスの再構築は行いません。
再構築には ALTER INDEX を使用してください。~
&br;

**用例 [#dafd5ba7]
 埋め込みSQLで実行する例です。

 EXEC SQL
 SET STATISTICS INDEX MINSALX;

**参照 [#a6c74a55]
 [[ALTER INDEX>#alter_index]] , [[CREATE INDEX>#create_index]] ,
[[DROP INDEX>#drop_index]]~
&br;