連載
» 2005年05月24日 00時00分 公開

Oracle SQLチューニング講座(12):更新/挿入/削除のSQLを高速化する3つの技とは? (1/3)

本連載では、Oracleデータベースのパフォーマンス・チューニングの中から、特にSQLのチューニングに注目して、実践レベルの手法を解説する。読者はOracleデータベースのアーキテクチャを理解し、運用管理の実務経験を積んでいることが望ましい。対象とするバージョンは現状で広く使われているOracle9iの機能を基本とするが、Oracle 10gで有効な情報も随時紹介していく。(編集局)

[倉田寛正,株式会社アゲハ]
「連載:Oracle SQLチューニング講座」のインデックス

連載目次

 前回は、絞込み条件(WHERE条件)の有無による結合処理や、マテリアライズド・ビューなどOracleの機能を利用した結合処理のチューニング手法を説明しました。今回は、WHERE条件がないDML(INSERT、DELETE、UPDATE)処理を高速化するチューニング手法について説明します。

MERGE文を利用する

 MERGE文はOracle9iから利用できるSQLで、データが存在している場合には既存データを更新(UPDATE)し、データが存在しない場合にはデータを挿入(INSERT)することが1つのSQLで実行できます。これによって、これまではアプリケーションで分岐処理をしたり、PL/SQLなどで繰り返し実行したりしていた処理が、MERGE文を1回実行するだけで可能になりました。

図1 PL/SQLとMERGE文での処理フローの比較 図1 PL/SQLとMERGE文での処理フローの比較

 それでは、実際にPL/SQL処理とMERGE文処理を実行し、処理時間、実行統計を比較してみましょう。「ORDERS_TEMP」表には10万件、「ORDERS」表には5万件のデータが格納されており、「ORDERS_TEMP」表のデータを基に「ORDERS」表に対してUPDATE、INSERT処理を実行します。

 なお、PL/SQL内で実行している各SQLの実行統計は、個別に出力されます。

図2 PL/SQL処理を使用した場合の実行統計 図2 PL/SQL処理を使用した場合の実行統計
図3 MERGE文を使用した場合の実行統計 図3 MERGE文を使用した場合の実行統計

 図2から、PL/SQLの場合は各SQLが別々の実行統計として出力されるため、実際の処理時間(elapsed)は各実行統計の処理時間を合計した「44.56秒」かかっていることが確認できます。一方、MERGE文を使用した場合は「17.92秒」であり、PL/SQLの半分以下の処理時間となっています。

 また、図2と図3のアクセスブロック数に大きな違いが確認できます。これはPL/SQLでは何度も同じ表にアクセスしていますが、MERGE文では1回だけのアクセスで済むためであり、その結果MERGE文では大幅なパフォーマンス向上につながっています。

 注意すべき点として、MERGE文では1つのSQLで実行するのでトランザクションを分けることができませんが、PL/SQLではトランザクションを分けたり、エラー処理をすることが可能です。そのため、例えば、列定義よりもデータ長の大きいデータにUPDATEしたときにPL/SQLではエラー処理や、事前のチェックロジックを加えることでエラー発生個所の特定などを行うことが可能です。そのため、実行時の更新パフォーマンスと、エラー発生時のリカバリ処理の両方を検討、テストしてから利用するようにしてください。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。