クエリを変更せずにプランを制御するには、少なくとも11の方法があります。それらは、おおまかに有用性の順に以下にリストされています:
- SQL計画のベースライン -あるプランを別のプランに置き換えます。
- SQLプロファイル -計画に「修正」ヒントを追加します。たとえば、プロファイルに「この結合は予想の100倍の行を返す」と表示され、間接的に計画が変更される場合があります。
- 保存された概要 -アイデアはSQLプランベースラインに似ていますが、機能が少なくなっています。このオプションは使いやすいですが、強力ではなく、サポートされなくなりました。
- DBMS_STATS.SET_X_STATS -テーブル、列、インデックスの統計を手動で変更すると、オブジェクトを人為的に多かれ少なかれ高価に見せることで、計画を大幅に変更できます。
- セッション制御 -たとえば、
alter session set optimizer_features_enable='11.2.0.3';
。常に役立つパラメータがあるとは限りません。ただし、OPTIMIZER_ *パラメータの1つが役立つ場合があります。または、文書化されていないヒントを使用して計画を変更したり、次のような機能を無効にしたりできる場合があります。alter session set "_fix_control"='XYZ:OFF';
- システム制御 -上記と同様ですが、システム全体に適用されます。
- DBMS_SPD -SQLプランディレクティブは、オプティマイザに修正情報を提供するという点でプロファイルに似ています。ただし、これはすべてのプランでより低いレベルで機能し、12cの新機能です。
- DBMS_ADVANCED_REWRITE -クエリを別のクエリに変更します。
- 仮想プライベートデータベース -述語を追加して、クエリを別のクエリに変更します。パフォーマンスを目的としたものではありませんが、悪用してインデックスアクセスパスを変更する可能性があります。
- SQL翻訳フレームワーク -解析される前に、クエリを別のクエリに変更します。これにより、完全に「間違った」SQLを実行できるようになります。
- SQLパッチ(dbms_sqldiag internal.i_create_patch) -クエリを別のクエリに変更します。 DBMS_ADVANCED_REWRITEに似ていますが、文書化されておらず、おそらくもう少し強力です。