dbms_stats 导入导出 schema 级别统计信息

    在使用CBO优化器模式的Oracle数据库中,统计信息是CBO生成最佳执行计划的重要依据。这些统计信息通常包括列级、表级、索引、系统级别的统计信息等。所有的这些统计信息都可以被备份,导入导出也可以被锁定与解锁。因此相应地,我们可以导出列级、表级、索引、系统级别的统计信息。通过导出导入统计信息,可以在测试环境来模拟产生环境进行数据库性能优化,SQL调优等。本文主要描述了基于schema级别导出导入统计信息到不同的数据库。

    关于统计信息的具体描述与用法,本文不作详细介绍,大家可以参考 Oracle references 。

 

1、导入导出统计信息的情形或作用
  a、可以把生产环境的统计信息导入到测试环境使得执行计划的产生能极大程度上等同于生产环境
  b、通过导入导出可以冻结执行计划,即控制与对比不同环境中的执行计划
  c、统计信息可以在重新analyze schema之前进行备份,防止analyze后性能下降
  d、系统级别的统计信息可以被移植到小型服务器来模拟Oracle在大型服务器的运行环境
  e、系统级别的统计信息也可以用于迁移到新服务器以保证一致的执行计划直到真正开始使用新服务器
  f、由于不同的工作负载需要使用不同的统计信息,可以在这些负载运行前给予合适的统计信息(如白天的OLTP,晚上为批量job模式)

 

2、schema级别统计信息导出导入的主要步骤
  a、收集统计信息(源schema或者含系统级别)
  b、创建用于存储统计信息的表(如stats_table)
  c、使用dbms_stats.export_schema_stats导出schema统计信息到表stats_table
  d、使用datapump expdp导出stats_table表。(可考虑SQL*Plus copy方式实现来避免导入导出)
  e、ftp或scp/cp dump文件到目的schema所在的服务器
  f、使用datapump impdp导入dmp文件到目的schema,如果需要备份,应在导入之前备份原统计信息
  g、使用dbms_stats.import_system_stats导入统计信息到所需的schema

 

3、创建统计信息的示例
--下面是一个基于schema scott级别进行收集统计信息的例子

  1. BEGIN  
  2.    DBMS_STATS.gather_schema_stats (ownname            => 'SCOTT',  
  3.                                    options            => 'GATHER AUTO',  
  4.                                    estimate_percent   => DBMS_STATS.auto_sample_size,  
  5.                                    method_opt         => 'for all columns size repeat',  
  6.                                    degree             => 8);  
  7. END;  
  8. /  
BEGIN
   DBMS_STATS.gather_schema_stats (ownname            => 'SCOTT',
                                   options            => 'GATHER AUTO',
                                   estimate_percent   => DBMS_STATS.auto_sample_size,
                                   method_opt         => 'for all columns size repeat',
                                   degree             => 8);
END;
/

 

4、演示导出导入统计信息导不同的DB

  1. --下面将数据库mmbo5上scott的统计信息导入到另外一个数据库mmbo4下的scott中   
  2. a、收集统计信息  
  3. scott@MMBO5> delete from emp where deptno=20;  
  4.   
  5. scott@MMBO5> commit;  
  6.   
  7. scott@MMBO5> exec dbms_stats.gather_schema_stats('SCOTT',cascade=>true);  
  8.   
  9. scott@MMBO5> select table_name,num_rows,last_analyzed from user_tables;  
  10.   
  11. TABLE_NAME                       NUM_ROWS LAST_ANALYZED  
  12. ------------------------------ ---------- -----------------   
  13. DEPT                                    4 20130513 22:19:10  
  14. EMP                                     9 20130513 22:19:10      --->emp表被删除了5条记录还剩9条   
  15. BONUS                                   0 20130513 22:19:10  
  16. SALGRADE                                5 20130513 22:19:10  
  17. TT                                      4 20130513 22:19:10  
  18.   
  19. b、创建用于存储统计信息的表  
  20. --可以指定表存放于哪个表空间,如果缺省则存放到用户的缺省表空间   
  21. scott@MMBO5> exec dbms_stats.create_stat_table('SCOTT''STATS_TABLE');  
  22.   
  23. PL/SQL procedure successfully completed.  
  24.   
  25. c、导出scott的统计信息到stats_table  
  26. scott@MMBO5> exec dbms_stats.export_schema_stats('SCOTT','STATS_TABLE','SCOTT');  
  27.   
  28. PL/SQL procedure successfully completed.  
  29.   
  30. scott@MMBO5> exit  
  31.   
  32. d、导出统计信息到dump文件  
  33. oracle@Dev-DB-04:~> expdp scott/tiger directory=db_dump_dir dumpfile=st.dmp logfile=st.log tables=STATS_TABLE  
  34.   
  35. Export: Release 10.2.0.4.0 - 64bit Production on Monday, 13 May, 2013 22:20:53  
  36.   
  37. Estimate in progress using BLOCKS method...  
  38. Processing object type TABLE_EXPORT/TABLE/TABLE_DATA  
  39. Total estimation using BLOCKS method: 64 KB  
  40. Processing object type TABLE_EXPORT/TABLE/TABLE  
  41. Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX  
  42. . . exported "SCOTT"."STATS_TABLE"                       17.82 KB      74 rows  
  43. Master table "SCOTT"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded  
  44. ******************************************************************************  
  45. Dump file set for SCOTT.SYS_EXPORT_TABLE_01 is:  
  46.   /u02/database/MMBO5/BNR/dump/st.dmp  
  47. Job "SCOTT"."SYS_EXPORT_TABLE_01" successfully completed at 22:21:11  
  48.   
  49. e、ftp统计信息到目的服务器并导入dump文件  
  50. --由于下面是在同一台服务器,所以直接用cp命令复制dump文件到特定目录   
  51. oracle@Dev-DB-04:~> cp /u02/database/MMBO5/BNR/dump/st.dmp /u02/database/MMBO4/BNR/dump  
  52.   
  53. f、使用datapump impdp导入dmp文件到目的schema  
  54. oracle@Dev-DB-04:~> export ORACLE_SID=MMBO4  
  55. oracle@Dev-DB-04:~> impdp scott/tiger directory=db_dump_dir dumpfile=st.dmp logfile=imp_st.log tables=STATS_TABLE  
  56.   
  57. Import: Release 10.2.0.4.0 - 64bit Production on Monday, 13 May, 2013 22:22:57  
  58. Processing object type TABLE_EXPORT/TABLE/TABLE  
  59. Processing object type TABLE_EXPORT/TABLE/TABLE_DATA  
  60. . . imported "SCOTT"."STATS_TABLE"                       17.82 KB      74 rows  
  61. Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX  
  62. Job "SCOTT"."SYS_IMPORT_TABLE_01" successfully completed at 22:23:03  
  63.   
  64. g、导入统计信息到目标数据库的schema  
  65. --导入前先查看一下本数据库scott的统计信息   
  66. scott@MMBO4> select table_name,num_rows,last_analyzed from user_tables;  
  67.   
  68. TABLE_NAME                       NUM_ROWS LAST_ANALYZED  
  69. ------------------------------ ---------- -----------------   
  70. STATS_TABLE  
  71. DEPT                                    4 20130513 22:16:05  
  72. EMP                                    14 20130513 22:16:05  
  73. BONUS                                   0 20130513 22:16:05  
  74. SALGRADE                                5 20130513 22:16:05  
  75. T                                   49991 20130513 22:16:20  
  76.   
  77. rows selected.  
  78.   
  79. --导入统计信息   
  80. scott@MMBO4> exec dbms_stats.import_schema_stats('SCOTT','STATS_TABLE','SCOTT');  
  81.   
  82. PL/SQL procedure successfully completed.  
  83.   
  84. --可以通过查询视图dba_optstat_operations获得目标数据库上统计信息日志   
  85. ALTER SESSION SET nls_timestamp_tz_format='yyyy-mm-dd hh24:mi:ss';  
  86. COL start_time FORMAT a14  
  87. COL end_time FORMAT a14  
  88. COL operation FORMAT a30  
  89. COL target FORMAT a30  
  90. SET LINESIZE 120  
  91.   
  92. SELECT operation,  
  93.        target,  
  94.        start_time,  
  95.        end_time  
  96.   FROM dba_optstat_operations  
  97.  WHERE operation LIKE 'import%';  
  98.   
  99. OPERATION                      TARGET                         START_TIME     END_TIME  
  100. ------------------------------ ------------------------------ -------------- --------------   
  101. import_schema_stats            SCOTT                          2013-05-13 22: 2013-05-13 22:  
  102.                                                               24:23          24:23  
  103.   
  104. --Author: Robinson   
  105. --Blog  : http://blog.csdn.net/robinson_0612   
  106.                                                                  
  107. --下面的查询也可以看到此时scott下LAST_ANALYZED已经被更新为与源服务器上的统计信息相同   
  108. scott@MMBO4> select table_name,num_rows,last_analyzed from user_tables;  
  109.   
  110. TABLE_NAME                       NUM_ROWS LAST_ANALYZED  
  111. ------------------------------ ---------- -----------------   
  112. STATS_TABLE  
  113. DEPT                                    4 20130513 22:19:10  
  114. EMP                                     9 20130513 22:19:10  
  115. BONUS                                   0 20130513 22:19:10  
  116. SALGRADE                                5 20130513 22:19:10  
  117. T                                   49991 20130513 22:16:20  
  118.   
  119. rows selected.  
  120.   
  121. scott@MMBO4> select count(*) from emp;  
  122.   
  123.   COUNT(*)  
  124. ----------   
  125.         14  
  126. --实际上在mmbo4上表emp的数据依旧为14条,但统计信息为9条,是来自源数据库的统计信息   
  127. --对于源数据库schema上存在,但目标数据库schema不存在的对象,如mmbo5上的表tt,在mmbo4上不会被导入   
  128. --对于源数据库schema上不存在,但目标数据库schema存在的对象,如mmbo4上的表t,其统计信息没有被更新   
  129.   
  130. h、根据需要可以考虑是否清除存储统计信息的表  
  131. scott@MMBO4> exec dbms_stats.drop_stat_table('SCOTT','STATS_TABLE');  
  132.   
  133. PL/SQL procedure successfully completed.  
  134.   
  135. --对于系统级别的统计信息的导入导出,此处不做演示,需要注意的是应使用dbms_stats中相应的导入导出procedure.   
  136. --dbms_stats.gather_system_stats   
  137. --dbms_stats.import_system_stats   
  138. --dbms_stats.export_system_stats 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值