暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 复制分区表统计

askTom 2018-11-09
1040

问题描述

嗨,团队,

根据应用程序团队的要求,我们需要将表统计信息从一个表复制到另一个表。

源表和目标表都是分区表。

在这里,我们在本地系统中测试了以下步骤:

1.创建的虚拟表

create table t1(c1, c2)
  partition by range (c1) (
    partition p1 values less than (1000),
    partition p2 values less than (2000),
    partition p3 values less than (3000)
  )
  as
  select level-1, level
  from dual
  connect by level <= 3000
  ;
复制


2.收集统计数据
 exec dbms_stats.gather_table_stats(sys, 't1', granularity=>'all');
复制


3.在表 “统计” 中导出统计信息
 exec dbms_stats.create_stat_table('SYS','STATISTICS');
 
 exec dbms_stats.export_table_stats('SYS','T1',NULL,'STATISTICS');
复制


4.克里特岛目标表

create table t3(c1, c2)
  partition by range (c1) (
    partition p1 values less than (1000),
    partition p2 values less than (2000),
    partition p3 values less than (3000)
  )
  as
  select level-1, level
  from dual
  connect by level <= 3000  ;
复制


5.导出统计信息的更新表名

   update statistics set c1='T2';

   12 rows updated.

SQL> commit;

Commit complete.
复制


6.目标分区表中的导入表

   exec dbms_stats.import_table_stats('SYS','T3', null, 'STATISTICS');

    SQL> select partition_name,last_analyzed from dba_tab_partitions where table_name='T3' and 
    table_owner='SYS';

     PARTITION_NAME                 LAST_ANAL
    ------------------------------ ---------
      P1                             09-NOV-18
      P2                             09-NOV-18
      P3                             09-NOV-18


    SQL> select table_name, num_rows from dba_tables where table_name in ('T1','T3');

     TABLE_NAME                       NUM_ROWS
      ------------------------------ ----------
      T1                                   3000
      T3                                   3000
复制



请确认这一步是否正确?根据我的理解,它们应该是全局统计和分区统计,我们都需要导入,但是在这里,我只是将表统计的整体导出并导入。

这是否有意义,或者这里需要执行一些其他步骤?

此外,在语法执行中,dbms_stats.import_table_stats('SYS','t3 ',null,'STATISTICS'); 'null' 表示什么?

问候,
克里希纳

专家解答

Eeeeek!在SYS中创建表格!不!

始终创建自己的用户并在那里制作新表。

无论如何,导出/导入表stats的第三个参数是分区名称。使用它仅管理该分区的统计信息:

create table t1(c1, c2)
partition by range (c1) (
partition p1 values less than (1000),
partition p2 values less than (2000),
partition p3 values less than (3000)
)
as
select level-1, level
from dual
connect by level <= 3000;

create table t3(c1, c2)
partition by range (c1) (
partition p1 values less than (1000),
partition p2 values less than (2000),
partition p3 values less than (3000)
)
as
select level-1, level
from dual
connect by level <= 3000;

exec dbms_stats.gather_table_stats(user, 't1', granularity=>'all');
exec dbms_stats.create_stat_table(user,'STATISTICS');
exec dbms_stats.export_table_stats(user,'T1',NULL,'STATISTICS');

update statistics set c1='T3';

commit;

exec dbms_stats.import_table_stats(user,'T3', 'P1', 'STATISTICS');

select table_name, partition_name, num_rows, last_analyzed 
from   user_tab_statistics
where  table_name like 'T_'
order  by 1, 2;

TABLE_NAME   PARTITION_NAME   NUM_ROWS   LAST_ANALYZED          
T1           P1                     1000 12-NOV-2018 02:44:28   
T1           P2                     1000 12-NOV-2018 02:44:28   
T1           P3                     1000 12-NOV-2018 02:44:28   
T1                            3000 12-NOV-2018 02:44:28   
T3           P1                     1000 12-NOV-2018 02:44:28   
T3           P2                                     
T3           P3                                     
T3                            

exec dbms_stats.import_table_stats(user,'T3', null, 'STATISTICS');

select table_name, partition_name, num_rows, last_analyzed
from   user_tab_statistics
where  table_name like 'T_'
order  by 1, 2;

TABLE_NAME   PARTITION_NAME   NUM_ROWS   LAST_ANALYZED          
T1           P1                     1000 12-NOV-2018 02:44:28   
T1           P2                     1000 12-NOV-2018 02:44:28   
T1           P3                     1000 12-NOV-2018 02:44:28   
T1                            3000 12-NOV-2018 02:44:28   
T3           P1                     1000 12-NOV-2018 02:44:28   
T3           P2                     1000 12-NOV-2018 02:44:28   
T3           P3                     1000 12-NOV-2018 02:44:28   
T3                            3000 12-NOV-2018 02:44:28 
复制


至于您应该导入所有源表统计信息还是仅针对一个分区: 这取决于。

你为什么要这样做,而不是使用在目标表上收集的正常统计数据?

所有分区都存储相同的值吗?

如果是这样的话,批发一份可能是对的。但是如果你只想刷新一个分区,答案可能是否定的。这取决于你的目标是什么。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论