バインドピークについて調べてみた

2024/07/01に公開

はじめに

Oracleを運用していてバインドピークという単語は何回も聞いていましたが「バインド変数関連でパフォーマンス悪くなることあるんだー」と、バインドピークについて説明できないのに理解した気になっていました。
そんなバインドピークについて調べてみたので備忘録として残しておこうと思います。

きっかけ

Oracleのパフォーマンスが悪く、原因追及の中にバインドピーク機能が候補に挙がったので改めて調べることにしました。

バインドピークとは

SQLを実行する際に、バインド変数に渡された値を基に最適な実行計画を生成する機能です。この機能はその名のとおり、バインド変数に渡された具体的な値をpeek(覗き見る)ことで最適な実行計画を生成することができます。

SQL初回実行時

SQL初回実行時にバインド変数の値を基に最適な実行計画を生成します。

2回目以降の実行時

初回実行時に生成された実行計画はキャッシュされ、2回目以降のSQL実行時に再利用されることでパフォーマンス向上に役立ちます。

メリット

バインドピーク機能があることで、バインド変数が使われたSQLでもリテラル値のSQLの場合同じようにより最適な実行計画を生成することが可能になります。

デメリット

実行計画がキャッシュされ、2回目以降の実行時に再利用されると記載しましたが、この実行計画が毎回最適とは限りません。
例えば、バインド変数に特殊な値が入っていた場合、キャッシュされた実行計画が最適ではなく、逆にパフォーマンス劣化につながる可能性があります。今回の調査理由にはこのパターンの可能性があり調査しました。

まとめ

結果的に私が管理するOracleではバインドピーク機能が原因ではない、という結論に至りましたが、優秀な機能である反面、わからず使っていると痛い目みそうだと改めて思いました。
バインドピークに限らず、パフォーマンスに左右する機能は数多くあると思うので、少しでも多く理解しようと思います。
バインド変数についても近いうちまとめようと思います。

Discussion