共有プールにキャッシュされた情報は、SQLが完全に同一の場合にのみ再利用されます。WHERE句に指定されている条件値が異なっていたり、SQLの意味が同一でもスペースの個数、改行位置、大文字、小文字など、少しでも異なっていれば違うSQLとして新たに解析されてしまいます。表2にSQLが共有されない例を示します。
表2のSQLはすべて違うSQLとして解析されます。どのような場合にHARD PARSEが発生するのかを理解し、HARD PARSEの発生を少なくすることを意識してください。
なお、キャッシュされたSQLがアクセスする表、索引の定義変更や、再作成を行うと、キャッシュされたSQLは無効となり、次回の実行時にはハードパースが発生します。そのためこれらの処理を行う場合には、なるべくデータベースのアクティビティが低い時間帯に行うようにしてください。
同じ結果を返す以下のSQL(1)、(2)を同一セッションで交互に2回実行します。セッション単位の統計情報を取得することができる、動的パフォーマンス・ビュー「V$SESSTAT」を参照し、解析処理がどのように実行されているかを確認します。
SQL(1) SQL(2) ----------------------------------------------------------- |
例1 実行するSQL |
SELECT文の実行結果は同じですが、(4)、(5)で確認できるようにSQL(1)、(2)の1回目の実行後に「parse count(hard)」の回数が増加しています。これはそれぞれのSQLでHARD
PARSEが実行されていることを表しています。上記の場合、SQLの改行位置が異なるため、それぞれ別のSQLであるとOracleは判断し、両方のSQLに対しHARD
PARSEを行っています。それに対して(6)、(7)では、すでに解析結果がキャッシュされているため、「parse count (total)」の回数のみが増加しています。これはHARD
PARSEが実行されていることを表しており、解析結果を再利用していることになります。
アプリケーションを開発する際には、大文字、小文字、改行位置、TABやスペースの個数など、SQLの記述ルールを細かく定めておくべきです。例えば、SQLの構文(SELECT/DELETE/INSERT/FROM/WHEREなど)は大文字、列名、表名などのオブジェクト名は小文字、TABは1つなど、具体的に決めておくことが重要です。
Copyright © ITmedia, Inc. All Rights Reserved.