パフォーマンスを向上させるSQLの記述法Oracle SQLチューニング講座(6)(2/3 ページ)

» 2004年11月20日 00時00分 公開
[亀田明裕株式会社アゲハ]

再解析が行われる場合

 共有プールにキャッシュされた情報は、SQLが完全に同一の場合にのみ再利用されます。WHERE句に指定されている条件値が異なっていたり、SQLの意味が同一でもスペースの個数、改行位置、大文字、小文字など、少しでも異なっていれば違うSQLとして新たに解析されてしまいます。表2にSQLが共有されない例を示します。

 表2のSQLはすべて違うSQLとして解析されます。どのような場合にHARD PARSEが発生するのかを理解し、HARD PARSEの発生を少なくすることを意識してください。

 なお、キャッシュされたSQLがアクセスする表、索引の定義変更や、再作成を行うと、キャッシュされたSQLは無効となり、次回の実行時にはハードパースが発生します。そのためこれらの処理を行う場合には、なるべくデータベースのアクティビティが低い時間帯に行うようにしてください。

表2 SQLが共有されない例 表2 SQLが共有されない例

同義なSQL実行結果

 同じ結果を返す以下のSQL(1)、(2)を同一セッションで交互に2回実行します。セッション単位の統計情報を取得することができる、動的パフォーマンス・ビュー「V$SESSTAT」を参照し、解析処理がどのように実行されているかを確認します。

SQL(1)
-----------------------------------------------------------
SELECT * FROM supplier WHERE s_suppkey=1;


SQL(2)
-----------------------------------------------------------
SELECT * FROM supplier 
WHERE s_suppkey=1;
例1 実行するSQL

解析処理の確認

図1 同じ結果を返すSQLの解析処理を比較 図1 同じ結果を返すSQLの解析処理を比較
*SQLが実行されているセッションIDを便宜上「SID=8」としています

 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.

RSSについて

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

メールマガジン登録

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