问题描述
嗨,团队,
根据应用程序团队的要求,我们需要将表统计信息从一个表复制到另一个表。
源表和目标表都是分区表。
在这里,我们在本地系统中测试了以下步骤:
1.创建的虚拟表
2.收集统计数据
3.在表 “统计” 中导出统计信息
4.克里特岛目标表
5.导出统计信息的更新表名
6.目标分区表中的导入表
请确认这一步是否正确?根据我的理解,它们应该是全局统计和分区统计,我们都需要导入,但是在这里,我只是将表统计的整体导出并导入。
这是否有意义,或者这里需要执行一些其他步骤?
此外,在语法执行中,dbms_stats.import_table_stats('SYS','t3 ',null,'STATISTICS'); 'null' 表示什么?
问候,
克里希纳
根据应用程序团队的要求,我们需要将表统计信息从一个表复制到另一个表。
源表和目标表都是分区表。
在这里,我们在本地系统中测试了以下步骤:
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的第三个参数是分区名称。使用它仅管理该分区的统计信息:
至于您应该导入所有源表统计信息还是仅针对一个分区: 这取决于。
你为什么要这样做,而不是使用在目标表上收集的正常统计数据?
所有分区都存储相同的值吗?
如果是这样的话,批发一份可能是对的。但是如果你只想刷新一个分区,答案可能是否定的。这取决于你的目标是什么。
始终创建自己的用户并在那里制作新表。
无论如何,导出/导入表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 T13000 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。