以前、記事にもしたOracleパーティションについて、最近ハマった罠があったため備忘録のためにまとめます。
<以前の記事>
Oracleのパーティションで「EXCHANGE」を使用する際には注意せよ
Oracleデータベースで大量データを取り扱う際にはパーティションが便利
今回、業務で以下のようなテーブルを改修しました。
<テーブル情報>
◾️テーブルA:区分、キーコードA、会社コード、商品コード、登録日(YYYYMMDD)
◾️テーブルB:キーコードB、商品コード、売上日(YYYYMMDD)
・テーブルBはひと月に5千万〜1億件近く発生して、それが10年分溜まっている。
・売上日をパーティションキーにしている
<修正前SQL>
SELECT
・・・
FROM (
SELECT
・・・
FROM
テーブルA
WHERE ・・・
)AS TBL _A
INNER JOIN (
SELECT
・・・
FROM
テーブルB
WHERE 売上日≧ 固定日
AND 売上日 ≦ 変動日(パラメータ)
)AS TBL_B
ON TBL_A.商品コード = TBL_B.商品コード
<修正内容>
・変動日(パラメータ)で与えている箇所を、テーブルAの登録日に変更する。
・テーブルA.登録日を使用するため、「売上日 ≦ 変動日(パラメータ)」を外出しする
<修正後SQL>
SELECT
・・・
FROM (
SELECT
・・・
FROM
テーブルA
WHERE ・・・
)AS TBL _A
INNER JOIN (
SELECT
・・・
FROM
テーブルB
WHERE 売上日≧ 固定日
)AS TBL_B
ON TBL_A.商品コード = TBL_B.商品コード
AND 売上日 ≦ A.登録日
外出しになっても、結局パーティションキーに対してFROM-TOを定義しているから、Oracleがいい感じに判断してパーティションが効くかと思い込んでいたのですが・・残念ながらパーティションキーが効きませんでした!
そのため、修正前は2分程度で完了する処理が1時間超えてしまうという大幅な性能劣化となりました。
今回の件で、パーティションへの理解がまたひとつ深くなりました。感謝。
車の運転と同じく、大丈夫「だろう」は危険ですね。
特にパーティションは処理速度への影響がでかいので、注意して事前検証する必要があるなーと思いました。
以上