0

ウィンドウ パーティションを使用している 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 になるのはなぜですか?

4

1 に答える 1

1

Oracle ドキュメントによると、正しい構文はmethod_opt=>('FOR COLUMNS (HUB_POL_KEY,PIT_EFF_START_DT) SIZE 254'). 試してみると、予想どおりにヒストグラム統計が作成されませんでした (おそらくバグ ¯_(ツ)_/¯)。

反対側ではmethod_opt=>('FOR ALL COLUMNS SIZE 254')orを使用しmethod_opt=>('FOR COLUMNS <column_name> SIZE 254')て正常に動作しています。

おそらく回避策は、列の統計を個別に収集することです。

EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT', method_opt=>('FOR COLUMNS HUB_POL_KEY SIZE 254'));
EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT', method_opt=>('FOR COLUMNS PIT_EFF_START_DT SIZE 254'));
于 2019-04-04T16:13:41.367 に答える