【SQL】インデックスによるチューニング(カバーリングインデックス)

ここではORACLEデータベースのSQLで、インデックスを使ったチューニング方法を紹介します。

インデックスの基礎的な内容については↓で紹介していますので参考にしてください。
>>【ORACLE】索引・インデックスとは

インデックスによるチューニング

通常、インデックスというとデータの絞り込みを行う際に利用します。

ただ実は少し違った使い方もできます。
それがカバーリングインデックスと呼ばれる使い方です。

下のようなSQLでは顧客マスタ、担当者マスタ、部門マスタを参照していますが
必要なのは主キーとなる項目と名称の2つだけです。

しかし、このとき名称を取得すると同時に1レコード文のデータを読み込んでいます。
顧客マスタでは住所や代表者の名前や各種区分など、他の項目も取得していることになります。
ディスクI/O的には非常に無駄なアクセスになります。

これを解消するためにインデックスを利用します。

インデックスを作成するSQLサンプル例

インデックスを作成するSQLサンプルを紹介します。

次のSQLに対してインデックスを作成します。

select
    x.顧客コード
    ,b.顧客名
    ,x.担当者コード
    ,c.担当者名
    ,x.部署コード
    ,d.部署名
    ,x.売上金額
from
    (select
        a.顧客コード
        ,a.担当者コード
        ,a.部署コード
        ,SUM(売上金額) as 売上金額
    from
        売上 a
    group bya.顧客コード
        ,a.担当者コード
        ,a.部署コード) x
    ,顧客マスタ b
    ,担当者マスタ c
    ,部門マスタ d
where
    x.顧客コード = b.顧客コード
    and x.担当者コード = c.担当者コード
    and x.部署コード = d.部署コード
;

次のインデックスでは、主キーとなる項目と名称の2つの複合インデックスを作成します。

このインデックスを利用することで、インデックスへのアクセスでコードと名称を同時に取得することができ、僅かですがI/Oを改善することが出来ます。

CREATE INDEX 顧客マスタ_idx0ON test01.顧客マスタ(顧客コード,顧客名) TABLESPACE index_tbs;

CREATE INDEX 担当者マスタ_idx0ON test01.担当者マスタ(担当者コード,担当者名) TABLESPACE index_tbs;

CREATE INDEX 部門マスタ_idx0ON test01.部門マスタ(部署コード,部署名) TABLESPACE index_tbs;

もしもインデックスが利用されないようであれば、ヒントを使ってインデックスを指定します。

ヒントの書き方については↓で紹介していますので参考にしてください。
>>【ORACLE】SQLヒントの書き方:サンプル多数あり

最後に

最後までお読みいただきありがとうございます。

インデックスの作成以外にもSQLチューニングの方法を↓で紹介していますので参考にしてください。
>>SELECT文のSQLチューニング方法まとめ