【问题标题】:After insert data to a partitioned table, why the num_rows is 0 in user_tab_partitions?向分区表插入数据后,为什么 user_tab_partitions 中的 num_rows 为 0?
【发布时间】:2018-07-13 14:27:23
【问题描述】:

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

【问题讨论】:

    标签: oracle performance partitioning


    【解决方案1】:

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

    【讨论】:

    • 感谢 Mureinik,因为我想添加一些新分区,但是当我 ALTER TABLE tar 添加分区 tar_001 VALUES LESS THAN ( TO_DATE('01-12-2015','DD-MM-YYYY' ));遇到错误:在间隔分区对象上不允许添加分区。有什么方法可以在不改变'Interval partitioned'属性的情况下解决它?
    • @Tom 使用间隔分区,您不需要添加分区。只需插入您的数据,oracle 会在您这样做时自动创建所需的分区。
    • 所以,其实我们创建了分区表,不需要手动定义这么多分区,只保留一个分区,对吧?分区 per_limra_p004 值小于 (TO_DATE('01-11-2015','DD-MM-YYYY')),
    • @Tom 是的。软管只是初始分区。如果你没有特殊的理由来抢先定义它们,那就不要。
    【解决方案2】:

    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快很多(前提是这张表有索引)

    【讨论】:

    • 其实,数据已经插入到指定分区成功了吧?
    • 我已将我的分区 SQL 添加到问题正文中,我已为 cycle_mth=2015-May-31 插入了一个数据,然后我使用了 SELECT COUNT() FROM per_limra PARTITION FOR (DATE '2015-06-01');结果是 1,这是正确的。但是当我 SELECT COUNT() FROM per_limra PARTITION FOR (DATE '2015-05-01');结果也是1,为什么?
    • 我们无权访问您的数据库,也无法查看您的表是如何定义的。我建议运行 SELECT * FROM PER_LIMRA 来查看表格中的实际内容。
    • @BobJarvis 。我已经检查了数据。结果是正常的。我可以弄清楚为什么会发生这种情况?
    • @Tom:请参阅我对上述评论中提出的问题的解决方案的回答。
    【解决方案3】:

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

    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 日。因此,两个查询都从同一个分区返回数据,这就是它们返回相同值的原因。

    祝你好运。

    【讨论】:

    猜你喜欢
    • 2019-02-20
    • 2011-06-28
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2016-07-23
    相关资源
    最近更新 更多