ROWID によるアクセス

OracleではROWIDにてアクセスする方法が一番速いです。

ROWIDはどのテーブルにも必ずあるシステム用の列です。
ROWIDにはレコードの物理アドレスがセットされています。
インデックスなどにもROWIDが使用されているようです。
ROWIDは、セッションが終了すると変化するかもしれませんが、
同一セッション中は不変であり、Oracleでは常に最速のアクセスが保証されます。

ROWIDの存在は知っていましたが、何に使用するかいつも疑問でした。
ところが今回使用する機会が訪れました。
大量にある履歴テーブルに単価を再設定しました。
履歴テーブルなのでキーがありませんが日付がミリ秒まであるので重複はないです。
データ毎に単価を求めて商品コードと日付を条件に更新していく処理です。
調査してみると処理時間の99%は最後のUPDATEに費やしています。

UPDATE テーブル名 SET 更新項目 = 更新内容
WHERE 商品コード = 該当商品コード AND 日付 = 該当日付

実行プランで確認してみても、UPDATEする度にテーブルをフルスキャンしていました。

ROWIDを使用しないで作成した場合、約3時間かかりました。
これではまずいと思い考えた方法がROWIDでの更新です。

SELECT ROWID,更新項目 FROM テーブル名

にてデータとROWIDを取得し

UPDATE テーブル名 SET 更新項目 = 更新内容 WHERE ROWID = 取得したROWID

上記のように更新をROWIDをキーにて更新するように変更しました。
ROWIDを使用することによりフルスキャンだったUPDATEが
インデックススキャンに変わりコストも1/100になりました。
結果、約3時間かかっていた処理が約30秒で完了するようになりました。

HWM空き領域が多すぎるというオチがあるかもですが
管理者でなければそこは不用意に触れないので今回の対応はこれでOKとします。


0 件のコメント:

コメントを投稿