将数据插入分区表后,为什么user_tab_partitions中的num_rows为0?

时间:2018-07-13 14:27:23

标签: oracle performance partitioning

问题1.数据未成功插入到指定分区吗? 因为我需要删除指定的分区,所以尽管user_tab_partitions中的num_rows为0,但我仍要确保必须成功插入指定的分区。

问题2。我用Google搜索了一些想法,有人说我需要分析表格。 为什么需要分析?

问题3。 如果我分析表格,与不分析表格相比,性能会有所不同吗?

enter image description here

PARTITION BY RANGE ( CYCLE_MTH ) INTERVAL ( numtoyminterval(1,'MONTH') )
( 
PARTITION per_limra_p004
    VALUES LESS THAN ( TO_DATE('01-11-2015','DD-MM-YYYY') ),
PARTITION per_limra_p003
    VALUES LESS THAN ( TO_DATE('01-12-2015','DD-MM-YYYY') ),
PARTITION per_limra_p002
    VALUES LESS THAN ( TO_DATE('01-01-2016','DD-MM-YYYY') ),

3 个答案:

答案 0 :(得分:2)

Oracle不会不断更新其有关表和分区的统计信息,因为这会很繁重。分析表格后,统计信息(例如user_tab_partitions中的统计信息)将会更新。由于Oracle现在具有不同的统计信息,因此优化器很可能会为您的查询创建不同的执行计划,从而影响性能。

答案 1 :(得分:1)

NUM_ROWS显示基于上一次分析的行数,因此您不应依赖它。我建议依靠它,例如

SELECT COUNT(*) 
FROM your_table PARTITION FOR (DATE '2016-04-01')

SELECT COUNT(ROWNUM)
FROM your_table PARTITION FOR (DATE '2016-04-01')
WHERE ROWNUM <= 1

它应该比DBMS_STATS.GATHER_TABLE_STATS快得多(前提是您在此表上有任何索引)

答案 2 :(得分:1)

根据您添加到问题中的分区信息,答案很明确。

SELECT COUNT() FROM per_limra PARTITION FOR (DATE '2015-06-01')

SELECT COUNT() FROM per_limra PARTITION FOR (DATE '2015-05-01')

两个返回1都是他们都在看同一个分区。您的三个分区是

PARTITION per_limra_p004
  VALUES LESS THAN ( TO_DATE('01-11-2015','DD-MM-YYYY'), i.e. less than 01-Nov-2015

PARTITION per_limra_p003
  VALUES LESS THAN ( TO_DATE('01-12-2015','DD-MM-YYYY'), i.e. less than 01-Dec-2015

PARTITION per_limra_p002
  VALUES LESS THAN ( TO_DATE('01-01-2016','DD-MM-YYYY'), i.e. less than 01-Jan-2016

查询中的日期为DATE '2015-06-01'或2015年6月1日,以及DATE '2015-05-01'或2015年5月1日,两者均属于分区per_limra_p004的范围,其中包含2015年11月1日之前所有日期的数据。因此,两个查询都从相同的分区返回数据,这就是为什么它们都返回相同的值。

好运。