本連載では、Oracleデータベースのパフォーマンス・チューニングの中から、特にSQLのチューニングに注目して、実践レベルの手法を解説する。読者はOracleデータベースのアーキテクチャを理解し、運用管理の実務経験を積んでいることが望ましい。対象とするバージョンは現状で広く使われているOracle9iの機能を基本とするが、Oracle 10gで有効な情報も随時紹介していく。(編集局)
前回は、絞込み条件(WHERE条件)の有無による結合処理や、マテリアライズド・ビューなどOracleの機能を利用した結合処理のチューニング手法を説明しました。今回は、WHERE条件がないDML(INSERT、DELETE、UPDATE)処理を高速化するチューニング手法について説明します。
MERGE文はOracle9iから利用できるSQLで、データが存在している場合には既存データを更新(UPDATE)し、データが存在しない場合にはデータを挿入(INSERT)することが1つのSQLで実行できます。これによって、これまではアプリケーションで分岐処理をしたり、PL/SQLなどで繰り返し実行したりしていた処理が、MERGE文を1回実行するだけで可能になりました。
それでは、実際にPL/SQL処理とMERGE文処理を実行し、処理時間、実行統計を比較してみましょう。「ORDERS_TEMP」表には10万件、「ORDERS」表には5万件のデータが格納されており、「ORDERS_TEMP」表のデータを基に「ORDERS」表に対してUPDATE、INSERT処理を実行します。
なお、PL/SQL内で実行している各SQLの実行統計は、個別に出力されます。
図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ではエラー処理や、事前のチェックロジックを加えることでエラー発生個所の特定などを行うことが可能です。そのため、実行時の更新パフォーマンスと、エラー発生時のリカバリ処理の両方を検討、テストしてから利用するようにしてください。
Copyright © ITmedia, Inc. All Rights Reserved.