PSQL Programmer's Guide (v11)

インデックスの作成 (リレーショナル インターフェイス)

インデックスは、特定の値を検索する操作、または特定の値によって並べ替える操作を最適化します。これらの操作のいずれかを頻繁に実行するすべての列に対し、インデックスを定義します。インデックスは、クエリの最適化において、特定の行または行のグループに対する高速の取得方法を提供します。Pervasive PSQL は、参照整合性(RI)付きのインデックスも使用します。インデックスは結合におけるパフォーマンスを向上し、クエリを最適化しやすくします。RI の詳細については、『Pervasive PSQL User's Guide』を参照してください。

Pervasive PSQL データベースでは、トランザクショナル データベース エンジンが定義する物理ファイルの一部としてインデックスを作成し、管理します。トランザクショナル データベース エンジン は、Insert、Update、または Delete オペレーションのすべての管理を行います。これらのアクティビティは、すべての Pervasive PSQL アプリケーションに対して透過的です。

インデックスを作成するには、CREATE INDEX ステートメントを使用します。この方法では、名前付きインデックスを作成します。名前付きインデックスを作成した後、そのインデックスを削除できます。インデックスの削除の詳細については、第 14データの挿入と削除を参照してください。

インデックスを使用して行をソートしたり個々の行を高速に取得できますが、データベースのディスク保存領域が増加し、Insert、Update、または Delete オペレーションにおけるパフォーマンスが多少低下します。インデックスを定義するときは、これらの相殺条件を考慮してください。

次の例では、CREATE INDEX ステートメントを使用して、既に存在するテーブルにインデックスを追加します。

CREATE INDEX DeptHours ON Course
(Dept_Name, Credit_Hours)# 


メモ

多数のデータを含むファイルで CREATE INDEX ステートメントを使用する場合は、実行が終了するまでにある程度の時間がかかり、その間はほかのユーザーがそのファイル内のデータにアクセスできないことに注意してください。


CREATE TABLE ステートメントと CREATE INDEX ステートメントの詳細については、『SQL Engine Reference』を参照してください。

インデックス セグメント

同じテーブル内の単一の列または列のグループ上にインデックスを作成できます。複数の列を含むインデックスをセグメント化されたインデックスと呼び、各列をインデックス セグメントと呼びます。

たとえば、サンプル データベースの Person テーブルには以下の 3 つのインデックスがあります。

インデックス セグメントの数は、データ ファイルのページ サイズの影響を受けます。PAGESIZE キーワードの使用方法の詳細については、『Btrieve API Guide』を参照してください。テーブルに対して作成できるインデックスの最大数は、データ ファイルのページ サイズと各インデックス内のセグメント数により異なります。表 41 に示すように、ページ サイズが 4096 バイトより小さいデータ ファイルには、ページ サイズ 4096 のデータ ファイルと同じ個数のインデックス セグメントを収容できません。使用するインデックス セグメントの数はファイルのページ サイズによって異なります。

表 41 データ ファイルあたりの最大インデックス セグメント数
ページ サイズ(バイト数)
キー セグメントの最大数(ファイル バージョン別)
 
8.x 以前
9.0
9.5
512
  8
  8
切り上げ2
1,024
 23
 23
97
1,536
 24
 24
切り上げ2
2,048
 54
 54
97
2,560
 54
 54
切り上げ2
3,072
 54
 54
切り上げ2
3,584
 54
 54
切り上げ2
4,096
119
119
204
8,192
N/A1
119
420
16,384
N/A1
N/A1
420
1 N/A は「適用外」を意味します。
2 「切り上げ」は、ページ サイズを、ファイル バージョンでサポートされる次のサイズへ切り上げることを意味します。たとえば、512 は 1,024 に切り上げられ、2,560 は 4,096 に切り上げるということです。

Status Codes and Messages』マニュアルで、ステータス コード 26 "指定されたキーの数が不正です"、およびステータス コード 29 "キーの長さがインデックス セグメントとトランザクショナル インターフェイスに関して不正です" を参照してください。

ページ サイズと固定レコード長を使用して、データが格納されている効率性、たとえば、ページあたりの無駄に使用されているバイト数などを計算することができます。ページあたりのレコード数を少なくすることによって、ページレベル ロックでのロックが問題となる並行処理を改善することができます。

デフォルトでは、Pervasive PSQL はすべてのテーブルをページ サイズ 4096 バイトで作成します。ただし、CREATE TABLE ステートメントの PAGESIZE キーワードを使用してより小さなページ サイズを指定したり、MicroKernel Database エンジンを使用してテーブルを作成し、そのテーブルにより小さなページ サイズを指定することができます。

テーブルに対して定義されたインデックス セグメントの総数を計算する場合、セグメント化されていないインデックスは 1 つのインデックス セグメントとしてカウントされます。たとえば、テーブルに 3 つのインデックスが定義されていて、そのうちの 1 つに 2 つのセグメントがある場合、インデックス セグメントの総数は 4 です。

Pervasive PSQL Control Center を使用して、定義されたインデックス セグメント数とデータ ファイルのページ サイズを表示できます。このユーティリティの詳細については、『Pervasive PSQL User's Guide』を参照してください。

インデックス属性

インデックスを作成する場合は、インデックスに一連の特性、つまり、属性を割り当てることができます。インデックス属性は、インデックスの変更可能性と、テーブルに定義するインデックスを Pervasive PSQL がどのようにソートするかを決定します。インデックス定義を作成または変更するたびに、インデックス属性を指定するパラメーターを取り込むことができます。

インデックスは、以下の属性を持つことができます。

大文字と小文字の区別
Pervasive PSQL がソート中に大文字と小文字をどのように評価するかを決定します。デフォルトでは、Pervasive PSQL は大文字と小文字を区別するインデックスを作成します。大文字と小文字を区別するインデックスを作成するには、インデックスを作成するときに CASE キーワードを指定します。
ソート順
Pervasive PSQL がどのようにインデックス列の値をソートするかを決定します。デフォルトの設定で、Pervasive PSQL ではインデックス列の値を昇順(小さいものから大きなものへ)にソートします。降順にソートするインデックスを作成するには、インデックスを作成するときに DESC キーワードを指定します。
重複不可
Pervasive PSQL を使用して複数の行が同じインデックス列の値を持つことができるかどうかを決定します。デフォルトでは、Pervasive PSQL は一意でないインデックスを作成します。一意の値を必要とするインデックスを作成するには、インデックスを作成するときに UNIQUE キーワードを指定します。
変更可能性
Pervasive PSQL が対応する行をソートした後でインデックス列の値を変更できるかどうかを決定します。デフォルトでは、Pervasive PSQL が行を格納すると、Pervasive PSQL でインデックス列の値を変更できません。変更可能なインデックスを作成するには、インデックスを作成するときに MOD キーワードを指定します。
セグメント化
インデックスがセグメント化されるかどうか、つまり、1 つのインデックスに結合された列のグループからインデックスを構成するかどうかを指示します。デフォルトでは、Pervasive PSQL はセグメント化されないインデックスを作成します。CREATE TABLE ステートメントを使用してセグメント化されたインデックスを作成するには、インデックスの最後のセグメントを除き、作成する各インデックス セグメントに SEG キーワードを指定します(SEG キーワードは、指定された次の列が作成するインデックスのセグメントであることを指示します)。
CREATE INDEX コマンドでは一度に 1 つのインデックスだけしか作成できないため、SEG キーワードを使用してセグメント インデックスを指定する必要はありません。複数の列を指定する場合、Pervasive PSQL は列を指定する順に列を使用してセグメント化されたインデックスを作成します。
一部のみ
列とオーバーヘッドの合計サイズが 255 バイト以上のときに、Pervasive PSQL が CHAR 列または VARCHAR 列の一部を使用するかどうか、最後または唯一のインデックス列として設計するかどうかを示します。
デフォルトでは、Pervasive PSQL は部分インデックスを作成しません。CREATE INDEX ステートメントを使用して部分インデックスを作成するには、PARTIAL キーワードを指定します。

重複不可能性と変更可能性は、インデックス全体だけに適用されます。重複不可能性または変更可能性は、インデックス全体に適用しなければ、単一のインデックス セグメントに適用することはできません。たとえば、セグメント化されたインデックスを作成し、インデックス セグメントのうちの 1 つに MOD キーワードを指定する場合、すべてのセグメントに対して MOD キーワードを指定する必要があります。

それに対して、インデックス全体に影響を与えずに個々のインデックス セグメントに大文字と小文字の区別、ソート順序、セグメント化を適用できます。たとえば、大文字と小文字を区別するインデックスに大文字と小文字を区別しないインデックス セグメントを作成できます。

以下の条件を満たせば、部分インデックスはインデックス内に定義された最後の列にのみ適用されます。

インデックスの作成および使用可能な属性の詳細については、『SQL Engine Reference』の CREATE INDEX を参照してください。


列の作成 (リレーショナル インターフェイス)

リレーショナル データベース設計