[20170908]imp参数buffer的简单探究.txt

[20170908]imp参数buffer的简单探究.txt

--//exp,imp已经很少在用,如果存在8i估计还会用一下,下面因为别人遇到升级忘记家buffer参数(8i),导致导入缓慢,
--//当然还有许多因素,比如存在lob字段,不过还是简单探究参数buffer.

1.环境:
SCOTT@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

alter system set pga_aggregate_target=4G;
--//以前设置太小256M,因为测试环境,connect by方式建表经常报错,设置大一些.

create table t(x number, x2 varchar2(1000),x3 varchar2(1000))  SEGMENT CREATION IMMEDIATE;
insert into t select level, rpad(' ', 100, ' '),rpad('a',100,'a') from dual connect by level <= 1e6;
commit ;
exec sys.dbms_stats.gather_table_stats ( OwnName => 'SCOTT',TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false);

SCOTT@book> @ &r/tpt/seg2 scott.t
    SEG_MB OWNER SEGMENT_NAME SEG_PART_NAME SEGMENT_TYPE SEG_TABLESPACE_NAME BLOCKS     HDRFIL     HDRBLK
---------- ----- ------------ ------------- ------------ ------------------- ------ ---------- ----------
       234 SCOTT T                          TABLE        USERS                29952          4        546

--//234M.

2.导出:
$ exp scott/book tables=T file=t.dmp direct=y buffer=1280000
Export: Release 11.2.0.4.0 - Production on Fri Sep 8 11:48:29 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
About to export specified tables via Direct Path ...
. . exporting table                              T    1000000 rows exported
Export terminated successfully without warnings.

3.测试导入:

--//如果检索NESTED_TABLE_SET_REFS,可以找到imp导入执行如下语句.
SCOTT@book> select sql_id,sql_text,executions from v$sql where sql_id='62m8tgc8mhwr2';
SQL_ID        SQL_TEXT                                                       EXECUTIONS
------------- ------------------------------------------------------------ ------------
62m8tgc8mhwr2 INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "T" ("X", "X2", "X3"         1935
              ) VALUES (:1, :2, :3)

SCOTT@book> alter system flush shared_pool;
System altered.

SCOTT@book> select sql_id,sql_text,executions from v$sql where sql_id='62m8tgc8mhwr2';
no rows selected

--//开始测试不同buffer数量的情况:
alter table t rename to t1;
//drop table t purge ;
alter system flush shared_pool;

$ imp scott/book tables=T file=t.dmp  buffer=N

SCOTT@book> select sql_id,sql_text,executions from v$sql where sql_id='62m8tgc8mhwr2';
SQL_ID        SQL_TEXT                                                       EXECUTIONS
------------- ------------------------------------------------------------ ------------
62m8tgc8mhwr2 INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "T" ("X", "X2", "X3"         1935
              ) VALUES (:1, :2, :3)

--//上面仅仅显示N=1048576的情况.做一个表格记录:

N             EXECUTIONS
----------------------------------
8388608       242
4194304       484
2097152       968
1048576       1935
524288        3876
-----------------------------------

--//可以发现1个规律N成倍减少,插入语句的执行次数EXECUTIONS成倍增加.
--//另外并看不出设置再大buffer,加快导入速度.

4.胡乱分析:
--//自己的假象,buffer参数就是一个缓存,在这段内存组织数据,然后批量插入,这样你通过v$sql看到的执行次数就不是1e6,而是根据buffer参数变化.
--//拿N=1048576来分析看看.这里的1M如果表示缓存内存大小的话,前面记录的表大小232M,这样大约23X次,差距太大.

--//1000000/1935 = 516.795865633074

--//大约每次插入517条记录.

select DBMS_ROWID.ROWID_BLOCK_NUMBER (rowid) ,count(*) from t group by DBMS_ROWID.ROWID_BLOCK_NUMBER (rowid);
SCOTT@book> select * from (select DBMS_ROWID.ROWID_BLOCK_NUMBER (rowid) ,count(*) from t group by DBMS_ROWID.ROWID_BLOCK_NUMBER (rowid) ) where rownum<=5;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)     COUNT(*)
------------------------------------ ------------
                                1035           34
                                1036           34
                                1037           34
                                1038           34
                                1039           34

--//这样一块基本34条记录.
--//517/34=15.2058823529411764758,这样517条占用15-16块. 分析不对..换一个思路.

SCOTT@book> select table_name,blocks,avg_row_len from dba_tables where owner=user and table_name in ('T');
TABLE_NAME       BLOCKS  AVG_ROW_LEN
---------- ------------ ------------
T                 29477          207

--//1024*1024/207=5065.5845410628193236714,这样也不对.

--//数量类型占用22字节(最大),这个可以通过V$SQL_BIND_CAPTURE视图确定.
22+1000+1000=2022
1024*1024/2022=518.5835806132542375865

--//这样计算1M容纳的数量518与前面的计算516非常接近.

5.有了前面的分析:
--//如果表定义如下(其中1个字段修改长度2000):
1024*1024/3022=346.9808074123972865651
1000000/346.9808074123972865651=2882.0037841789624875591
--//按照这样推断插入是2882次,验证看看是否正确.

//drop table t purge;
//drop table t1 purge;
create table t(x number, x2 varchar2(2000),x3 varchar2(1000))  SEGMENT CREATION IMMEDIATE;
insert into t select level, rpad(' ', 100, ' '),rpad('a',100,'a') from dual connect by level <= 1e6;
commit ;
exec sys.dbms_stats.gather_table_stats ( OwnName => 'SCOTT',TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false);

$ exp scott/book tables=T file=t.dmp direct=y buffer=1280000
...

alter table t rename to t1;
//drop table t purge ;
alter system flush shared_pool;

$ imp scott/book tables=T file=t.dmp  buffer=1048576

SCOTT@book> select sql_id,sql_text,executions from v$sql where sql_id='62m8tgc8mhwr2';
SQL_ID        SQL_TEXT                                                       EXECUTIONS
------------- ------------------------------------------------------------ ------------
62m8tgc8mhwr2 INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "T" ("X", "X2", "X3"         2891
              ) VALUES (:1, :2, :3)
--//执行次数是2891.与推断的结果非常接近.

--//如果表定义如下(其中2个字段修改长度2000):
1024*1024/4022=260.7100944803580308343
1000000/260.7100944803580308343=3835.6781005859374999431
--//按照这样推断插入是3835次,验证看看是否正确.

//drop table t purge;
//drop table t1 purge;
create table t(x number, x2 varchar2(2000),x3 varchar2(2000))  SEGMENT CREATION IMMEDIATE;
insert into t select level, rpad(' ', 100, ' '),rpad('a',100,'a') from dual connect by level <= 1e6;
commit ;
exec sys.dbms_stats.gather_table_stats ( OwnName => 'SCOTT',TabName => 't',Estimate_Percent => NULL,Method_Opt => 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false);

$ exp scott/book tables=T file=t.dmp direct=y buffer=1280000
...

alter table t rename to t1;
//drop table t purge ;
alter system flush shared_pool;

$ imp scott/book tables=T file=t.dmp  buffer=1048576

SCOTT@book> select sql_id,sql_text,executions from v$sql where sql_id='62m8tgc8mhwr2';
SQL_ID        SQL_TEXT                                                       EXECUTIONS
------------- ------------------------------------------------------------ ------------
62m8tgc8mhwr2 INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "T" ("X", "X2", "X3"         3847
              ) VALUES (:1, :2, :3)

--//执行次数是3847.与推断的结果非常接近.
--//好久不写blog,有点无聊....

时间: 2024-10-23 18:21:08

[20170908]imp参数buffer的简单探究.txt的相关文章

[20170910]imp参数buffer的简单探究2.txt

[20170910]imp参数buffer的简单探究2.txt --//exp,imp已经很少在用,如果存在8i估计还会用一下,下面因为别人遇到升级忘记家buffer参数(8i),导致导入缓慢, --//当然还有许多因素,比如存在lob字段,不过还是简单探究参数buffer. --//上个星期做了参数buffer的简单探究,发现缓存大小除以记录的最大长度=每次插入记录数量. --//忘记测试缺省是多少,补充测试看看. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRI

[20131220]频率直方图的简单探究.txt

[20131220]频率直方图的简单探究.txt http://allthingsoracle.com/histograms-part-1-why/http://www.itpub.net/thread-1816475-1-1.html 昨天本想看12c的混合直方图的相关信息,无意之中发现以上链接,Jonathan Lewis给出很好的例子,newkid的翻译写的很清晰,自己再按照上面的介绍写一些例子做一些测试. 我的测试环境11.2.0.3,建立测试环境: SYS@test> @verBANN

[20171109]简单探究文件ab_ASM_SID.dat.txt

[20171109]简单探究文件ab_ASM_SID.dat.txt --//昨天看了一篇Solving Communication problems between DB and ASM instances.链接 --//http://www.toadworld.com/platforms/oracle/b/weblog/archive/2017/11/07/solving-communication-problems-between-db-and-asm-instances --//如果意外

[20170315]简单探究dg的mrp进程.txt

[20170315]简单探究dg的mrp进程.txt --//昨天上午在做测试做在线日志与备用日志大小不一样时遇到一个令我困惑的问题,链接: http://blog.itpub.net/267265/viewspace-2135377/ --//发现mrp进程并没有打开数据文件的句柄.这样MRP进程如何应用日志的呢?简单探究看看: 1.环境: SYS@192.168.31.8/xxxxxx> @ &r/ver1 PORT_STRING                    VERSION  

[20130307]clob字段的简单探究2.txt

[20130307]clob字段的简单探究2.txt 前段时间研究一下clob字段.看看函数empty_clob()与null的区别.今天测试有信息插入的情况. http://space.itpub.net/267265/viewspace-755269参考文档: http://www.juliandyke.com/Presentations/LOBInternals.ppt 从上次的测试可以看出:1.clob字段NULL与empty_clob()是不同的.2.如果clob字段有信息,除了保存信

[20160902]简单探究linux的free命令.txt

[20160902]linux命令free的buffers与cached表示什么.txt --简单探究linux的free命令. $ free              total       used       free     shared    buffers     cached Mem:     132261196   29620656  102640540          0     174340   24209712 -/+ buffers/cache:    5236604 

[20140114]简单探究nested table-之2.txt

  [20140114]简单探究nested table-存储问题.txt 对nested table一点也不熟悉,估计也很少人使用,今天看了一些文档,做一些简单的探究,估计以后也不会使用. 1.测试环境: SCOTT@test> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Re

[20140827]imp exp 使用管道迁移数据.txt

[20140827]imp exp 使用管道迁移数据.txt --最近帮别人升级一套数据库,9i到11g. --那个慢真让人受不了,也许是以前的老机器性能不行.数据量并不大.导出花了时间比较长. --我很久就知道导出可以管道压缩导出文件,实现一边导出一边压缩的功能,现在硬盘空间都很大,很少考虑这种方式. --而且现在很少使用这种方式备份数据. --是否可以使用管道实现一边导出一边导入呢?这样可以节约时间,我做了一个测试: --全部操作都在目的端进行,主要是exp/imp版本问题(烦),操作系统都

[20171101]linux peekfd的简单使用.txt

[20171101]linux peekfd的简单使用.txt --//今天再解决一个问题时需要使用fuser命令,看看某个文件是那些进程打开,在执行时发现普通用户无法执行,我记忆里普通用户可以执 --//行的,我看了一台CentOS release 6.2 (Final)的机器,可以正常执行,我还发现在这台机器的/etc/peofile路径中包含如下脚本: # Path manipulation if [ "$EUID" = "0" ]; then     pat