グローバル一時テーブルからデータを集計するクエリがあります。テーブルは、集計の直前に入力されます。私の目標は、そのクエリの信頼できる説明計画です。
何かを挿入する必要なしに、一時テーブルのフィルレベルをシミュレートする方法はOracleDBMSにありますか?
例
通常のクエリ:
INSERT INTO gtt VALUES(..)
SELECT * FROM gtt
計画を説明する:
EXPLAIN PLAN FOR SELECT * FROM gtt /* with hint for maybe 10k records */
動機:目標は、ステートメントがコストとCPUのしきい値を下回っているかどうかを確認することです。どのような種類または量の一時データがチューニングの概念を壊しているかを調べたいと思います。
テスト目的で、GTTにデータを挿入し、統計を収集し、統計をロックできます。これにより、GTTにデータがあるかのように、別のセッションで説明プランを取得できます。テストが完了したら、統計をアンロックする必要があります。
どうしてこのリクエストがあるのかしら。 Oracle 12c以降、GTTにはデフォルトでセッションプライベート統計があります。挿入後に単純に統計を収集できます。 Oracle 11gでは、一度にGTTをクエリする単一のセッションのみが保証されている場合でも、GTTの統計を安全に収集できます。それ以外の場合は、統計を削除してロックし、動的サンプリングを利用してテーブルに関する統計情報を取得できます。動的サンプリングのデフォルトレベルでは不十分な場合は、/*+ dynamic_sampling({alias} {level}) */
ヒントを使用して、クエリレベルでGTTのみのレベルを設定できます。別のオプションは、代表的な量のデータをロードし、統計をロックすることです。
あんまり;ただし、GTTの情報を集約するクエリのパフォーマンスを向上させることが目的である場合は、Oracleのバージョンが10g以上であれば、OPTIMIZER_DYNAMIC_SAMPLINGを5以上に設定できます。
これにより、Oracleのオプティマイザは、いくつかのサンプリングクエリを実行して最適な計画を決定するためにさらに努力するようになります。
ヒントを使ってそれを使うことができます:
SELECT /*+ OPT_PARAM('OPTIMIZER_DYNAMIC_SAMPLING' '5') */ * from gtt;