ウィンドウ パーティションを使用している Oracle 12c で SQL クエリのパフォーマンス チューニングを行おうとしています。テーブル PIT の HUB_POL_KEY、PIT_EFF_START_DT に作成されたインデックスがあります。/*+ gather_plan_statistics */ ヒントを使用して説明計画を実行しているときに、説明計画にウィンドウ ソート ステップがあり、推定行数が 5000K で、実際の行数が 1100 であることがわかりました。テーブルで DBMS_STATS.GATHER_TABLE_STATS を実行しました。 . USER_TAB_COLUMNS テーブルをチェックインすると、HUB_POL_KEY、PIT_EFF_START_DT に対して生成されたヒストグラムがないことがわかります。ただし、他のすべての列にはヒストグラムが存在します。
SQL クエリ
SELECT
PIT.HUB_POL_KEY,
NVL(LEAD(PIT.PIT_EFF_START_DT) OVER (PARTITION BY PIT.HUB_POL_KEY ORDER BY PIT.PIT_EFF_START_DT) ,TO_DATE('31.12.9999', 'DD.MM.YYYY')) EFF_END_DT
FROM PIT
1 回目の試行:
EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT');
2 回目の試行:
EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT', method_opt=>('FOR COLUMNS SIZE 254 (HUB_POL_KEY,PIT_EFF_START_DT)'));
ヒストグラムの確認:
SELECT HISTOGRAM FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'PIT'
AND COLUMN_NAME IN ('HUB_POL_KEY','PIT_EFF_START_DT') --NONE
テーブル統計:
SELECT COUNT(*) FROM PIT --5570253
SELECT COLUMN_NAME,NUM_DISTINCT,NUM_BUCKETS,HISTOGRAM FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'PIT'
AND COLUMN_NAME IN ('HUB_POL_KEY','PIT_EFF_START_DT')
+------------------+--------------+-------------+-----------+
| COLUMN_NAME | NUM_DISTINCT | NUM_BUCKETS | HISTOGRAM |
+------------------+--------------+-------------+-----------+
| HUB_POL_KEY | 4703744 | 1 | NONE |
| PIT_EFF_START_DT | 154416 | 1 | NONE |
+------------------+--------------+-------------+-----------+
ここで何が欠けていますか?サイズを指定する method_opt を使用して gather_table_stat プロシージャを実行している場合でも、バケット サイズが 1 になるのはなぜですか?