Oracle-即使在GATHER_TABLE_STATS之后,列直方图也不会显示

时间:2019-03-31 16:43:24

标签: oracle performance oracle12c table-statistics

我正在尝试对使用窗口分区的Oracle 12c中的SQL查询进行性能调整。在表PIT的HUB_POL_KEY,PIT_EFF_START_DT上创建了一个索引。在运行带有/ * + collect_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

第一次尝试:

EXEC DBMS_STATS.GATHER_TABLE_STATS('stg','PIT');

第二次尝试:

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指定大小的collect_table_stat过程时,存储桶大小仍为1?

1 个答案:

答案 0 :(得分:1)

根据Oracle documentation的正确语法应为method_opt=>('FOR COLUMNS (HUB_POL_KEY,PIT_EFF_START_DT) SIZE 254')。尝试此操作并没有产生预期的直方图统计信息(可能是错误__(ツ)_ /¯。)。

另一方面,使用method_opt=>('FOR ALL COLUMNS SIZE 254')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'));