この記事はNigel BaylissによるUsing the Automatic SQL Tuning Set in Oracle Database 19cを日本語に翻訳したものです。
2024年5月17日
Introduction
自動SQLチューニング・セット(ASTS)に関する以前の投稿をご覧になったことがあるかもしれません。 自動SPMのライセンスが緩和され、この機能はASTSがONになっていることに依存するため、再度この機能についてお話したいと思います。
ASTSは個々のSQL文情報をキャプチャしてSYSAUX表領域に格納するため、ASTSを有効にした場合、領域が消費されることが予想されます。一部のお客様から急激な増加が報告されたため、なぜこのようなことが起こるのかを調査しました。その後、この問題に対処するために2つの重要なパッチが作成されました:
Patch/Bug 15878434 – EXTEND LITERAL REPLACEMENT TO SUPPORT MERGE STATEMENTS TOO
Patch/Bug 35488357 – REDUCE NUMBER OF SQL STATEMENTS WITH SAME FORCE MATCHING SIGNATURE IN AUTO SQL TUNING SET
これらのパッチが必要ですか?
Patch 35488357は、SQL文が初めて出現した際、最初のバッチでキャプチャする動的SQL文の数を減らします。 例えば、アプリケーションが以下のようなSQLを生成する場合、データベースは最大1000のバージョンをキャプチャできます:
select col from table where id = 10; select col from table where id = 20; select col from table where id = 30; ...etc
Patch 15878434では、これを100に減らします。 技術的に言えば、ASTSは同じフォース・マッチング・シグネチャを持つSQLステートメントを100個までしかキャプチャできません(以前の1000個ではなく)。 これは動的SQLを利用している場合でも、ASTSがキャプチャする文の数を調整するようになったためです。
アプリケーションがバインド値を使っていたり、リテラルの利用を限定しているのであれば、このパッチを適用する必要はありません。
Patch 15878434により、MERGE文のフォース・マッチング・シグネチャが正しく扱われるようになります。たとえば、バインド変数の代わりにリテラルを使用するMERGE文には異なるフォース・マッチング・シグネチャがあるため、ASTS はすべてのバージョンを制限なくキャプチャします。たとえば、
merge into tab1 t1 using ... set t1.col1 = 'some literal value 1', col1 = 'some other literal 1' ... merge into tab1 t1 using ... set t1.col1 = 'some literal value 2', col1 = 'some other literal 2' ... merge into tab1 t1 using ... set t1.col1 = 'some literal value 3', col1 = 'some other literal 3' ... ...
自動SQLチューニング・セットが無期限または大幅に増加したお客様がいました。このパッチで、上記のMERGE文が同じフォース・マッチング・シグネチャを持つようになり、100を超えるバージョンがキャプチャされなくなります。
アプリケーションがMERGE文でリテラルではなくバインド変数を使用している場合は、このパッチを適用する必要はありません。
問題のある使用例
とあるオープンソースのORMフレームワークが生成した問題のある使用例を見ました。それは次のようなSQL文を生成しました。
insert into t1 values (:bind1, :bind2, :bind3, :bind4 ... ); insert into t1 values (:bind1, :bind2, :bind2, :bind3 ... ); insert into t1 values (:bind1, :bind4, :bind5, :bind6 ... ); ...
これらのSQL文はバインド値を使用しますが、バインド名が異なるため、各INSERT文は異なるフォース・マッチング・シグネチャを持ちます。 バインド変数の数が多ければ、組合せの数は膨大になります。ASTSは、1つ1つキャプチャします。 オラクルは、この動作はOracle Databaseではなく、クライアント側のツールで対処する必要があると考えています。 なお、私たちは関連するオープン・ソース・コミュニティに働きかけています。
パッチを入手できますか?
パッチは、現在RUに含まれていませんが、早急に対応するように依頼しています。パッチは比較的新しいもので、まだお客様からのリクエストがないため、MOSにはまだ表示されません。まずはリクエストしてください!
データベースが動的SQLしか利用していない場合は?
SQL計画管理は、繰り返し可能なSQL文で動作するように設計されています。そのため、動的SQLのみを使用し、カーソル共有の強制が使えない場合、SPMは大きな付加価値にはなりません。
ただし、自動索引作成などの自動化機能は、ASTSに依存しており、自動索引作成は、SQLが繰り返し実行されない場合でも、価値を提供します。 これがASTSで動的SQLをキャプチャする理由です。非常に多くの異なるSQL文を使用するユースケースを見られたため、シグネチャの最大キャプチャ数を1000から100に削減しました。