Oracle:効率のよいINDEXを作成するために役立つSQL | けしくんのWebLog

けしくんのWebLog

自分が考えたこと、調べたことを忘れずに残しておくため、Web上にLogを残していきます。

パフォーマンス改善の基本となるINDEXの作成の際、どの列にINDEXをつけるべきかを判断するためのSQLの紹介。

 

INDEXは、ただ検索条件や結合条件の列に対してつければ良いというものではない。

列の値の種類が多い(カーディナリティが高い)ところに作成し、効率よくデータを絞り込めるようにするのが基本。

複合INDEXの場合は、カーディナリティが高い順番に列を記載する。

 

よく使うOracle SQL/コマンドまとめ

 

Tableに作成されているIndexと格納されている表領域名の確認

col INDEX_NAME for a50

SELECT INDEX_NAME, TABLESPACE_NAME

FROM DBA_INDEXES
WHERE TABLE = 'テーブル名';


Tableの各列のカーディナリティの確認

 

set pasesize 1000

col COLUMN_NAME for a50

SELECT COLUMN_NAME, NUM_DISTINCT

FROM DBA_TAB_COLUMNS

WHERE TABLE_NAME = 'テーブル名'

ORDER BY COLUMN_NAME;

※NUM_DISTINCTは、Tableの統計情報が取得されたタイミングで更新されるため、統計情報がない場合は0となる。

Indexがどの列に対して作成されているかの確認

 

 

col INDEX_NAME for a50

col COLUMN_NAME for a50

SELECT INDEX_NAME, COLUMN_POSITION, COLUMN_NAME

FROM DBA_IND_COLUMNS

WHERE TABLE _NAME= 'テーブル名' --ここはINDEX_NAME='インデックス名'でもよい

ORDER BY INDEX_NAME, COLUMN_POSITION, COLUMN_NAME;

※COLUMN_POSITION:INDEXに含まれる列の記載順序

 複合INDEXの場合、どの順序になっているかが重要

 

よく使うOracle SQL/コマンドまとめ