【问题标题】:Dbms_Stats.Gather_Table_Stats after partition exchange in Oracle procedure?在 Oracle 程序中进行分区交换后的 Dbms_Stats.Gather_Table_Stats?
【发布时间】:2014-10-03 00:47:02
【问题描述】:

我有一个 oracle 程序,它将“table1 Partition (P1)”中的所有行插入到 table2 中。我更新 table2 中的一个字段,然后将分区交换回 table1:

Alter Table table1 Exchange Partition P1 WITH TABLE table2 Including Indexes Without Validation;

这行得通。

问题:之后我需要收集表格统计信息吗?代码:

EXECUTE  Dbms_Stats.Gather_Table_Stats (Ownname => 'MySchema', Tabname => 'Table1', Partname 
=> 'P1, Granularity =>  'ALL', Degree => 32);

需要很长时间才能运行,并且还涉及一些其他问题。

非常感谢,我用谷歌搜索并找不到明确的答案

  • 史蒂夫

Oracle 数据库 11g 企业版版本 11.2.0.3.0 - 64 位生产

【问题讨论】:

    标签: oracle partitioning


    【解决方案1】:

    当你运行exchange partition时,表的统计信息会变成分区的统计信息,分区的统计信息也会变成表的统计信息,也就是交换统计信息。

    这里我有一个包含三个分区的表,原来所有的统计信息都在那里:

    0:admspm@spmdtz> printStats -p location -- (*)
    
    Table_Name|object_Type   |subobject  |last_Analyzed|num_Rows|sample_Size|
    -------------------------------------------------------------------------
    LOCATION  |Table         |           |06.04. 15:23 |     817|        817|
    LOCATION  |TablePartition|PARTITION_1|06.04. 15:23 |     272|        272|
    LOCATION  |TablePartition|PARTITION_2|06.04. 15:23 |     272|        272|
    LOCATION  |TablePartition|PARTITION_3|06.04. 15:23 |     273|        273|
    

    现在换出一个分区并将其换回:

    0:admspm@spmdtz> create table xxx as select * from location where par_id=3;
    Table Xxx created.
    0:admspm@spmdtz> alter table location exchange partition partition_3 
                     with table xxx;
    Table Location altered.
    

    统计数据消失了:

    0:admspm@spmdtz> printStats -p location
    
    Table_Name|object_Type   |subobject  |last_Analyzed|num_Rows|sample_Size|
    -------------------------------------------------------------------------
    LOCATION  |Table         |           |06.04. 15:23 |     817|        817|
    LOCATION  |TablePartition|PARTITION_1|06.04. 15:23 |     272|        272|
    LOCATION  |TablePartition|PARTITION_2|06.04. 15:23 |     272|        272|
    LOCATION  |TablePartition|PARTITION_3|             |        |           |
    

    但是当我分析交换表'XXX'时

    0:admspm@spmdtz> stats -gT xxx -- (*)
    

    然后换回来,我又得到了正确的统计数据

    0:admspm@spmdtz> alter table location exchange partition partition_3 
                     with table xxx;
    Table Location altered.
    0:admspm@spmdtz> printStats -p location
    
    Table_Name|object_Type   |subobject  |last_Analyzed|num_Rows|sample_Size|
    -------------------------------------------------------------------------
    LOCATION  |Table         |           |06.04. 15:23 |     817|        817|
    LOCATION  |TablePartition|PARTITION_1|06.04. 15:23 |     272|        272|
    LOCATION  |TablePartition|PARTITION_2|06.04. 15:23 |     272|        272|
    LOCATION  |TablePartition|PARTITION_3|02.10. 18:24 |     273|        273|
    

    (*) 这些命令由senora 工具提供

    【讨论】:

    • 马丁您好,感谢您的指导。每个分区都有数亿行,更新特定字段的逻辑相当复杂。处理一个分区大约需要 10 分钟,数据的最终用户关心它的可用性。所以... 1)使用“插入...选择...”将记录插入交换表(连接到其他表...) 2)将分区交换回源。我考虑收集统计数据的唯一原因是是否需要以某种方式“提交”更改的数据。这就是我无法通过研究发现的......
    • 此外,运行进程的 Oracle 模式/用户无权收集位于不同模式中的源表的统计信息。我可以在 Source 表的模式中创建一个过程,并将执行权限授予 PROCESS_USER 模式,但我需要向 DBA 请求许可。再次感谢 - 史蒂夫
    • 我刚刚进行了一个简短的测试,发现我的答案不正确。我会相应地更新我的答案。
    • 马丁,太好了,谢谢。在此过程中,我在 table2 上收集统计信息。因此,当我将分区交换回 table1 时,它会自动处理它。非常有帮助!谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-08-31
    • 2018-09-04
    • 2019-10-18
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2019-01-10
    相关资源
    最近更新 更多