背景:有时我们会希望可以对Oracle的统计信息整体进行导出导入。比如在数据库迁移前后,希望统计信息保持不变;又比如想对统计信息重新进行收集,但是担心重新收集的结果反而引发性能问题,想先保存当前的统计信息,这样即使重新收集后效果不好还可以导入之前的统计信息。

Oracle提供给我们一些方法,比较常用的粒度有两种:

  • schema级别统计信息的导出导入

    通过调用DBMS_STATS.EXPORT_SCHEMA_STATS和DBMS_STATS.IMPORT_SCHEMA_STATS来进行。

  • database级别统计信息的导出导入

    通过调用DBMS_STATS.EXPORT_DATABASE_STATS和DBMS_STATS.IMPORT_DATABASE_STATS来进行。

统计信息存放的表可以通过DBMS_STATS.CREATE_STAT_TABLE和DBMS_STATS.DROP_STAT_TABLE来进行创建或是删除。

1.示例schema级别统计信息的导出导入

比如我将JINGYU这个schema下所有的统计信息进行导出导入:

--源端统计信息导出:
begin
DBMS_STATS.CREATE_STAT_TABLE('SYSTEM','JINGYU_STATS_20181217');
DBMS_STATS.EXPORT_SCHEMA_STATS(OWNNAME => 'JINGYU', STATTAB => 'JINGYU_STATS_20181217', STATOWN => 'SYSTEM');
end;
/
expdp \'/ as sysdba\' directory=xtts dumpfile=stats_jingyu.dmp logfile=stats_jingyu.log tables=system.jingyu_stats_20181217 --目标端统计信息导入:
impdp \'/ as sysdba\' directory=xtts dumpfile=stats_jingyu.dmp logfile=stats_jingyu.log cluster=n
exec DBMS_STATS.IMPORT_SCHEMA_STATS (OWNNAME => 'JINGYU', STATTAB => 'JINGYU_STATS_20181217', STATOWN => 'SYSTEM'); --删除存放统计信息的表(根据实际需要选择性执行):
exec DBMS_STATS.DROP_STAT_TABLE ('SYSTEM','JINGYU_STATS_20181217');

2.示例database级别统计信息的导出导入

如果想将数据库所有统计信息进行导出导入,方法非常类似,使用对应的过程:

--源端统计信息导出:
begin
DBMS_STATS.CREATE_STAT_TABLE('SYSTEM','DB_STATS_20181217');
DBMS_STATS.EXPORT_DATABASE_STATS(STATTAB => 'DB_STATS_20181217', STATOWN => 'SYSTEM');
end;
/
expdp \'/ as sysdba\' directory=xtts dumpfile=stats.dmp logfile=stats.log tables=system.db_stats_20181217 --目标端统计信息导入:
impdp \'/ as sysdba\' directory=xtts dumpfile=stats.dmp logfile=stats.log cluster=n
exec DBMS_STATS.IMPORT_DATABASE_STATS (STATTAB => 'DB_STATS_20181217', STATOWN => 'SYSTEM'); --删除存放统计信息的表(根据实际需要选择性执行):
exec DBMS_STATS.DROP_STAT_TABLE ('SYSTEM','DB_STATS_20181217');

3.验证统计信息导出导入效果

以数据库级别统计信息的导出导入为例,验证下实际的效果:
目前数据库JINGYU用户下各表在统计信息记录数:

SYS@orcl> select owner, table_name, NUM_ROWS from dba_tables where owner = 'JINGYU';

OWNER                          TABLE_NAME                       NUM_ROWS
------------------------------ ------------------------------ ----------
JINGYU TEST 100708
JINGYU ASH_TMP 226

此时按照之前的步骤导出数据库的统计信息,步骤不再赘述。

然后在某一张表插入数据,重新收集该表的统计信息:

SYS@orcl> insert into jingyu.ash_tmp select * from jingyu.ash_tmp;
SYS@orcl> commit; SYS@orcl> exec dbms_stats.gather_table_stats('JINGYU','ASH_TMP'); PL/SQL procedure successfully completed.

再去查询统计信息记录的该表行数:

SYS@orcl> select owner, table_name, num_rows from dba_tables where owner='JINGYU';

OWNER                          TABLE_NAME                       NUM_ROWS
------------------------------ ------------------------------ ----------
JINGYU TEST 100708
JINGYU ASH_TMP 452

此时按照之前的步骤导入数据库的统计信息,步骤不再赘述。

再去查询统计信息记录的该表行数,已经恢复到当时的导出时刻:

SYS@orcl>  select owner, table_name, num_rows from dba_tables where owner='JINGYU';

OWNER                          TABLE_NAME                       NUM_ROWS
------------------------------ ------------------------------ ----------
JINGYU TEST 100708
JINGYU ASH_TMP 226 SYS@orcl>

另外,需要注意如果统计信息导入的目标环境,数据库版本比源环境高(多发生在数据库升级场景),导入统计信息时会遇到下面这样的错误:

ERROR at line 1:
ORA-20002: Version of statistics table SYSTEM.DB_STATS_20181217 is too old.
Please try upgrading it with dbms_stats.upgrade_stat_table
ORA-06512: at "SYS.DBMS_STATS", line 11648
ORA-06512: at "SYS.DBMS_STATS", line 11665
ORA-06512: at "SYS.DBMS_STATS", line 12800
ORA-06512: at line 1

这时只需要按照提示执行下 dbms_stats.upgrade_stat_table:

exec dbms_stats.upgrade_stat_table('SYSTEM','db_stats_20181217');

再尝试导入统计信息就可以成功了。

测试Oracle统计信息的导出导入的更多相关文章

  1. 有关Oracle统计信息的知识点[z]

    https://www.cnblogs.com/sunmengbbm/p/5775211.html 一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如, ...

  2. 有关Oracle统计信息的知识点

    一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于 ...

  3. PLSQL_统计信息系列07_数据字典统计信息的导出和导入

    2014-05-05 Created By BaoXinjian

  4. [Oracle] oracle统计信息

    Oracle统计信息 Oracle数据库里的统计信息可以分为6种类型: 表的统计信息 索引的统计信息 列的统计信息 系统统计信息 数据字典统计信息 内部对象统计信息 图 1: Oracle统计信息 基 ...

  5. oracle统计信息

    手工刷ORACLE统计信息  select count(1) from LOG_TRX_DETAIL;  select * from user_tab_statistics where table_n ...

  6. 收集oracle统计信息

    优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...

  7. Oracle基础 数据泵导出/导入Expdp/impdp(转)

    一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...

  8. Oracle 统计信息收集

    官网网址参考: https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_stats.htm#CIHBIEII https://docs.ora ...

  9. Oracle 统计信息

    Oracle数据库中的统计信息是这样一组数据:它存储在数据字典中,且从多个维度描述了Oracle数据库里对象的详细信息. CBO会利用这些统计信息来计算目标SQL各种可能的,不同的执行路径的成本,从中 ...

随机推荐

  1. 明天软软onsite

    现在在飞机上,还有1.5小时到达.买了网络包,速度不错.今年上半年第三次飞西雅图,过几天也许还有第四次... 今天群主FB加面系统设计非常顺利,祝他拿到大包裹,也希望拿到以后发大红包,这回我一定不能错 ...

  2. 【QT】二进制读取图像文件测试

    QDataStream in(&file); int n; in >> n ; file.close(); qDebug() << n<<"en& ...

  3. MySQL 数据热备份

    mysqlhotcopy使用lock tables.flush tables和cp或scp来快速备份数据库.它是备份数据库或单个表最快的途径,完全属于物理备份,但只能运行在数据库目录所在的机器上. 与 ...

  4. 在IE中启动火狐——自定义浏览器链接协议

    有时候需求就是这么奇葩,特别是在这个浏览器混战收尾的节骨眼上,有的客户正在将全单位的浏览器统一到Chrome.有的正在统一到Firefox.还有的正在统一到360上.于是就有了如题的需求,客户正在将浏 ...

  5. IE 浏览器旧版本下载

    1. http://www.oldversion.com/windows/internet-explorer/ IE10 浏览器 32bit & 64 bit:下载 2. https://ww ...

  6. E - Heavy Transportation

    来源poj1797 Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now ...

  7. CTextUI 文本控件 显示数字方法

    得将数字变成字符串才行 m_ptxtCurrentcharUI->SetText(util::int32ToCString(txtLength)); 或 String.valueOf(x) 或 ...

  8. POI操作Excel详解,读取xls和xlsx格式的文件

    package org.ian.webutil;   import java.io.File; import java.io.FileInputStream; import java.io.FileN ...

  9. JVM内存布局

    1. 概述 对于从事c和c++程序开发的开发人员来说,在内存管理领域,他们既拥有最高权力的”皇帝“又是从事最基础工作的”劳动人民“---既拥有每个对象的”所有权“,又担负着每个对象开始到终结的维护责任 ...

  10. php导出超大csv导出方法,读取超大文件或者接受超大数组,防止内存溢出

    基本思路就是,知道总数之后分割成2万一个数组进行查询,最后独立写入csv,避免数据过大导致溢出 速度还不错,在php7下,机器I5 8G内存,128G,SSD,52W多条,大概也就30秒,出来整个文件 ...