パーティションプルーニングを機能させる方法

この記事ではパーティションプルーニングを機能させる方法について解説します。

 パーティションプルーニングとは

パーティションプルーニングとはパーティション表へアクセスする際に必要なパーティションのみにアクセスする仕組みです。

不要なパーティションにはアクセスしないため、取得するデータ量を減らして処理時間を削減することができます。

しかし、パーティション表に適切な方法でアクセスしないとパーティションプルーニングが機能しないので注意が必要です。


 パーティションプルーニングを機能させる方法

パーティションプルーニングを機能させるためには、パーティションキーをSQLのwhere句に指定する必要があります。

例えば年ごとにパーティションされている表「sales」に対してパーティションプルーニングを機能させるように検索すると以下のようになります。

select * from sales where time='22-07-01';

パーティションキーとなる「time」をwhere句で指定することによってパーティションプルーニングが機能しています。

パーティションプルーニングが機能しているかは実行計画を見ると確認できます。

-----------------------------------------------------------------------------------
| Id  | Operation              | Name  | Rows  | Bytes | Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |       |       |       |          |       |       |
|   1 |  PARTITION RANGE SINGLE|       |     1 |    13 | 00:00:01 |   KEY |   KEY | |*  2 |   TABLE ACCESS FULL    | SALES |     1 |    13 | 00:00:01 |   KEY |   KEY | -----------------------------------------------------------------------------------

実行計画に「PARTITION RANGE SINGLE」となっており、特定のパーティションのみにアクセスしていることがわかります。


 パーティションプルーニングが機能しないケース

パーティションキーをwhere句に指定してもパーティションプルーニングが機能しない場合があります。

一つ目のケースがパーティションキーに関数を使用した場合です。

次のようなSQLではパーティションプルーニングは機能しません。

select * from sales where to_char(time,'YYYYMMDD')='20220701'

実行計画を確認します。

--------------------------------------------------------------------------------
| Id  | Operation           | Name  | Rows  | Bytes | Time     | Pstart| Pstop |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |       |       |       |          |       |       |
|   1 |  PARTITION RANGE ALL|       |     1 |    13 | 00:00:01 |     1 |     4 |
|*  2 |   TABLE ACCESS FULL | SALES |     1 |    13 | 00:00:01 |     1 |     4 |
--------------------------------------------------------------------------------

「PARTITION RANGE ALL」となっており、すべてのパーティションにアクセスしてしまっていることがわかります。

同様にパーティションキーをLIKE演算子で指定した場合もパーティションプルーニングが機能しません。

select * from sales where time like '22%';

パーティションキーを条件句にする際には関数や算術は使用しないようにする必要があります。