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

After insert data to a partitioned table, why the num_rows is 0 in user_tab_partitions?

问题1、数据没有插入到指定分区成功? 由于我需要删除指定的分区,所以我需要确保插入到指定的分区必须成功,尽管user_tab_partitions中的num_rows为0。

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

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

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') ),

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快很多(前提是你有这个table的索引)

Oracle 不会经常更新其有关 table 和分区的统计信息,因为这太重了。一旦您分析了 table,统计数据(例如 user_tab_partitions 中的统计数据)将被更新。由于 Oracle 现在有不同的统计信息,优化器很可能会为您的查询创建不同的执行计划,从而影响性能。

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

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

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

both return 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',或 01-Jun-2015,和 DATE '2015-05-01',或 01-May-2015,这两个日期都在分区 [=15] 的范围内=],其中包含 2015 年 11 月 1 日之前所有日期的数据。因此,两者都从同一分区查询 return 数据,这就是它们 return 相同值的原因。

祝你好运。