向分区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 相同值的原因。
祝你好运。
问题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 相同值的原因。
祝你好运。