问题1.数据未成功插入到指定分区吗? 因为我需要删除指定的分区,所以尽管user_tab_partitions中的num_rows为0,但我仍要确保必须成功插入指定的分区。
问题2。我用Google搜索了一些想法,有人说我需要分析表格。 为什么需要分析?
问题3。 如果我分析表格,与不分析表格相比,性能会有所不同吗?
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') ),
答案 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日之前所有日期的数据。因此,两个查询都从相同的分区返回数据,这就是为什么它们都返回相同的值。
好运。