一、实验目的:

Insert插入表中相同的行数量,不同的列数量,通过10046 和autotrace工具对比查看逻辑读、物理读、time数据,并得出相应结论

二、测试

2.1测试流程:

=>【为尽可能满足测试数据可靠性,提前准备好操作流程】

=>实验数据及环境的准备:

#目标端环境准备:授予用户yang表空间的使用权限、

转储目录的创建及读写权限授予给yang用户

及 开启autotrace工具的权限

#源库使用数据泵导出一张表的测试数据,操作系统命令scp远程传输至目标端,目标端使用Impdp导入测试环境中,得到测试源表及数据后,创建一个与源表结构相同的测试表(结构相同,没有数据)

#查询验证源表,测试表是否满足上述条件,测试表是否有约束,有则禁用约束

=>会话监控10046 level 1事件开启、自动追踪 autotrace开启

会话一、使用SYS用户登录:对会话二进行10046 trace level 1事件追踪

会话二、使用yang用户登录:开启set autotrace traceonly 开启自动追踪工具

=>insert操作执行:

yang用户:执行第一个insert 操作,对测试表中所有的数据进行插入

commit提交后,truncate 截断清空测试表

yang用户:执行第二个insert操作,对测试表中的三个列数据进行插入

commit提交后

=>autotrace工具收集信息对比:

逻辑读、物理读、执行时间统计对比

=>结束会话追踪,生成trace文件,10046事件收集信息对比:

逻辑读、物理读、执行时间统计对比

=>对比结果进行分析,得出相应结论

2.2测试操作说明:

2.2.1工具说明:

=>10046事件:可以跟踪应用程序执行的SQL语句,根据开启的追踪级别不同:查询不同级别的信息

Level  1: 可以查看包含解析、执行、提取、提交、回滚等信息记录

Level  4: 可以查看包含解析、执行、提取、提交、回滚的信息 + 变量详细信息

Level  8: 可以查看包含解析、执行、提取、提交、回滚的信息 + 等待事件

Level  12:可以查看包含解析、执行、提取、提交、回滚的信息 + 绑定变量+等待事件

=>autotrace 自动追踪工具:可以查看SQL执行结果、执行计划、统计信息的查看

                Set autotrace on           打开工具开关,显示SQL执行结果+执行计划+统计信息
                Set autotrace traceonly 显示执行计划+统计信息
                Set autotrace traceonly explain  显示执行计划
                Set autotrace traceonly statistics 显示统计信息
      
      2.2.2:操作说明
            =>禁用测试表约束的考量:因为测试中,有Insert插入少量列的数据测试,如果有not null约束,则该列必须有值,为了简化操作过程,禁用约束
 
            =>trace文件中如何唯一标识SQL,如果测试过程中,由于误操作等原因产生多个相同的Insert语句,如何获取想要的SQL统计信息,每个Insert语句,通过大小写不同(得到不同的SQL_ID),即使相同的操作,SQL_id不同,更精确查找实验结果         
 
 
 
    2.3实际操作:
    
     
 =>目标端准备:
  1. #授予表空间存储无限制权限
  2. SQL> grant resource to yang;
  3. #授予yang用户可以开启autotrace权限
  4. @?/sqlplus/admin/plustrce
  5. SQL> grant plustrace to yang;
  6.  
  7. #创建转储目录
  8. SQL> create directory yy as '/home/oracle';
  9. #转储目录读写授予yang用户
  10. SQL> grant read,write on directory yy to yang;
  11. #查询转储目录
  12. SQL> select directory_name,directory_path from dba_directories;
  13.  
  14. DIRECTORY_NAME DIRECTORY_PATH
  15. --------------------------------------------------------
  16.  
  17. YY /home/oracle

=>源端数据导出,操作系统SCP命令远程传输文件至目标端

  1. #测试数据从源库导出:
  2. expdp \'/ as sysdba\' DIRECTORY=DMPDIR logfile=G_BIL_C_DAT_LTE_206_T_20180414.log DUMPFILE=G_BIL_C_DAT_LTE_206_T_20180414.dmp tables='gat.G_BIL_C_DAT_LTE_206_T_20180414' query='"where rownum<12000"'
  3.  
  4. #操作系统SCP远程拷贝$ scp G_BIL_C_DAT_LTE_206_T_20180414.dmp 192.168.20.67:/home/oracle/.
  5.  
  6. #源库查询信息:表的用户名称,表所在的表空间

SQL> select owner,tablespace_name from dba_segments where segment_name='G_BIL_C_DAT_LTE_206_T_20180414';

OWNER      TABLESPACE_NAME

--------------------------------------------------------------------------------

GAT        TBSFSH_DATA21

=>目标端:导入并创建测试表,查询验证

  1. #查询目标端测试用户yang的默认永久表空间
  2. SQL> select username,DEFAULT_TABLESPACE from dba_users where username='YANG';
  3.  
  4. USERNAME DEFAULT_TABLESPACE
  5. ------------------------------ ------------------------------
  6. YANG USERS
  7.  
  8. #导入源表
  9. [oracle@bj ~]$ impdp yang/yang directory=yy
  10. dumpfile=G_BIL_C_DAT_LTE_206_T_20180414.dmp
  11. remap_schema=GAT:yang remap_tablespace=TBSFSH_DATA21:users
  12.  
  13. #查询源表有多少行数据
  14.  
  15. SQL> select count(*) from G_BIL_C_DAT_LTE_206_T_20180414;
  16.  
  17. COUNT(*)
  18.  
  19. ----------
  20.  
  21. #创建测试表:
  22. CREATE TABLE "YANG"."G_BIL_C_DATA_LTE_20180414"
  23. ( ,) NOT NULL ENABLE,
  24. ,) NOT NULL ENABLE,
  25. ,) NOT NULL ENABLE,
  26. ,) NOT NULL ENABLE,
  27. ) NOT NULL ENABLE,
  28. ,),
  29. ---此处省略107个列---
  30. ) SEGMENT CREATION IMMEDIATE
  31. PCTFREE PCTUSED INITRANS MAXTRANS COMPRESS BASIC NOLOGGING
  32. STORAGE(INITIAL NEXT MINEXTENTS MAXEXTENTS
  33. PCTINCREASE FREELISTS FREELIST GROUPS
  34. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  35. TABLESPACE "USERS";
  36.  
  37. #查询测试表的约束名称:

SQL> select 'alter table '||table_name||' disable constraint '||CONSTRAINT_NAME||';'  "Script" from user_constraints where table_name='G_BIL_C_DATA_LTE_20180414' and status='ENABLED';

Script

--------------------------------------------------------------------------------

alter table G_BIL_C_DATA_LTE_20180414 disable constraint SYS_C004285;

--此处省略剩余6条语句

#执行上述禁用约束SQL:

alter table G_BIL_C_DATA_LTE_20180414 disable constraint SYS_C004285;

--此处省略剩余6条语句

#再次查询验证:测试表是否还有约束启用

SQL> select 'alter table '||table_name||' disable constraint '||CONSTRAINT_NAME||';'  "Script" from user_constraints where table_name='G_BIL_C_DATA_LTE_20180414' and status='ENABLED';

no rows selected

=>会话监控10046 level 1事件开启、自动追踪 autotrace开启

会话一、使用SYS用户登录:对会话二进行10046 trace level 1事件追踪

  1. #yang用户查询当前会话的操作系统进程号
  1. SQL> select spid from v$process a,v$session b where a.addr=b.paddr and b.sid=(select sid from v$mystat where rownum=1);
  2.  
  3. SPID
  4. ------------------------
  5. 29062
  6.  
  7. #SYS用户进行监控SQL> show userUSER is "SYS"SQL> oradebug setospid 29062;Oracle pid: 34, Unix process pid: 29062, image: oracle@bj (TNS V1-V3)SQL> oradebug event 10046 trace name context forever,level 1;Statement processed.

会话二、使用yang用户登录:开启set autotrace traceonly 开启自动追踪工具

  1. #yang用户开启自动追踪开关
  2. SQL> set autotrace traceonly;

=>insert操作执行:

yang用户:执行第一个insert 操作,对测试表中所有的数据进行插入

commit提交后,truncate 截断清空测试表

  1. insert /*+ parallel(t,4) */ into yang.G_BIL_C_DATA_LTE_20180414 t (TICKET_ID
  2. ,FILE_ID
  3. ,BATCH_ID
  4. ,SWITCH_ID
  5. ,SELF_CELL_ID
  6. ,SELF_MSC_ID
  7. ###此处省略剩余表的所有列名称###
  8. ,RATABLE_RESOURCE_LIST
  9. ,FLUX_CARD_LIST) select trim(TICKET_ID)
  10. ,trim(FILE_ID )
  11. ,trim(BATCH_ID )
  12. ,trim(SWITCH_ID )
  13. ,trim(SELF_CELL_ID )
  14. ,trim(SELF_MSC_ID )
  15. ###此处省略剩余表的所有列名称###
  16. ,trim(FLUX_CARD_LIST) from yang.G_BIL_C_DAT_LTE_206_T_20180414 t;

AUTOTRACE工具信息记录:

  1. Execution Plan
  2. ----------------------------------------------------------

| Id  | Operation                | Name                       | Rows  | Byte s | Cost (%CPU)| Time    | Pstart| Pstop |

-----------------------------------------------------------------------------------------------------------

  1. Plan hash value: | | INSERT STATEMENT | | | 200M| ()| :: | |
  2. | | LOAD TABLE CONVENTIONAL | G_BIL_C_DATA_LTE_20180414 | | | | | | |
  3. | | PARTITION LIST ALL | | | 200M| ()| :: | |
  4.  
  5. | | TABLE ACCESS FULL | G_BIL_C_DAT_LTE_206_T_20180414 | | 200M| ()| :: | | |
  6.  
  7. --------------------------------------------------------------------------------
  8. Note
  9. -----
  10. - )
  11.  
  12. Statistics
  13. ----------------------------------------------------------
  14. recursive calls
  15. db block gets
  16. consistent gets
  17. physical reads
  18. redo size
  19. bytes sent via SQL*Net to client
  20. bytes received via SQL*Net from client
  21. SQL*Net roundtrips to/from client
  22. sorts (memory)
  23. sorts (disk)
  24. rows processed

第一次操作:结束

  1. SQL> commit;
  2.  
  3. Commit complete.
  4.  
  5. SQL> truncate table G_BIL_C_DATA_LTE_20180414;

yang用户:执行第二个insert操作,对测试表中的三个列数据进行插入

commit提交后

  1. insert /*+ parallel(t,4) */ into yang.G_BIL_C_DATA_LTE_20180414 t (TICKET_ID,
  2. BSID,
  3. IPV6_PDSN_ADDRESS,
  4. RATABLE_RESOURCE_LIST) select trim(TICKET_ID),
  5. trim(BSID ),
  6. trim(IPV6_PDSN_ADDRESS ),
  7. trim(RATABLE_RESOURCE_LIST) from yang.G_BIL_C_DAT_LTE_206_T_20180414 t;

AUTOTRACE工具信息记录:

  1. Execution Plan
  2. ----------------------------------------------------------
  3. Plan hash value: 2515889339
  4.  
  5. --------------------------------------------------------------------------------
  6.  
  7. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
  8.  
  9. ---------------------------------------------------------------------------------------------------------------------------
  10.  
  11. | 0 | INSERT STATEMENT | | 24031 | 50M| 261 (1)| 00:00:04 | | |
  12.  
  13. | 1 | LOAD TABLE CONVENTIONAL | G_BIL_C_DATA_LTE_20180414 | | | | | | |
  14.  
  15. | 2 | PARTITION LIST ALL | | 24031 | 50M| 261 (1)| 00:00:04 | 1 | 2 |
  16.  
  17. | 3 | TABLE ACCESS FULL | G_BIL_C_DAT_LTE_206_T_20180414 | 24031 | 50M| 261 (1)| 00:00:04 | 1 | 2 |
  18.  
  19. ---------------------------------------------------------------------------------------------------------------------------
  20.  
  21. Note
  22. -----
  23. - dynamic sampling used for this statement (level=2)
  24.  
  25. Statistics
  26. ----------------------------------------------------------
  27. 24 recursive calls
  28. 25795 db block gets
  29. 1081 consistent gets
  30. 0 physical reads
  31. 10095484 redo size
  32. 841 bytes sent via SQL*Net to client
  33. 1045 bytes received via SQL*Net from client
  34. 3 SQL*Net roundtrips to/from client
  35. 1 sorts (memory)
  36. 0 sorts (disk)
  37. 23998 rows processed

=>autotrace工具收集信息对比:

逻辑读、物理读、执行时间统计对比

Autotrace

逻辑读

consistent gets

物理读

physical reads

TIME

时-分-秒

Insert插入表的所有列(全表总计94个列)

2057

1

00:00:04

Insert插入表的四个列

1081

0

00:00:04

=>结束会话追踪,生成trace文件,10046事件收集信息对比:

  1. SQL> oradebug trace name context off;
  2. Statement processed.
  3. SQL> show parameter user_dump_dest
  4.  
  5. NAME TYPE VALUE
  6. ------------------------------------ ----------- ------------------------------
  7. user_dump_dest string /picclife/app/oracle/diag/rdbms/aa/dingding/trace[oracle@bj admin]$ cd /picclife/app/oracle/diag/rdbms/aa/dingding/trace[oracle@bj trace]$ ls *29062.trcdingding_ora_29062.trc
  8.  
  9. [oracle@bj trace]$ tkprof dingding_ora_29062.trc /home/oracle/select.trc sys=no

#trace文件中第一次Insert,全表所有列的插入操作:

  1. insert /*+ parallel(t,4) */ into yang.G_BIL_C_DATA_LTE_20180414 t (TICKET_ID
  2. ,FILE_ID
  3. ,BATCH_ID      ****此处省略90个列名称    ,FLUX_CARD_LIST) select trim(TICKET_ID)                    ,trim(FILE_ID            )
  4. ,SELF_CELL_ID
  5. ****此处省略90个列名称
  6. ,trim(FLUX_CARD_LIST) from yang.G_BIL_C_DAT_LTE_206_T_20180414 t
  7.  
  8. call count cpu elapsed disk query current rows
  9. ------- ------ -------- ---------- ---------- ---------- ---------- ----------
  10. Parse 1 0.02 0.02 0 3 0 0
  11. Execute 1 8.64 15.29 1 1062 30554 23998
  12. Fetch 0 0.00 0.00 0 0 0 0
  13. ------- ------ -------- ---------- ---------- ---------- ---------- ----------
  14. total 2 8.66 15.32 1 1065 30554 23998
  15. #parse解析#execute执行#fetch获取#elapsed 执行时间#query 逻辑读#disk 物理读#current 当前读#rows 处理行数
  16.  
  17. #解析期间:库缓存中未命中:硬解析1次
  18. Misses in library cache during parse: 1
  19. Optimizer mode: ALL_ROWS
  20. Parsing user id: 54
  21. Number of plan statistics captured: 1
  22.  
  23. Rows (1st) Rows (avg) Rows (max) Row Source Operation
  24. ---------- ---------- ---------- ---------------------------------------------------
  25. 0 0 0 LOAD TABLE CONVENTIONAL (cr=1179 pr=1 pw=0 time=15305076
  26. us)
  27. 23998 23998 23998 PARTITION LIST ALL PARTITION: 1 2 (cr=957 pr=0 pw=0 time=
  28. 74766 us cost=262 size=209742568 card=24031)
  29. 23998 23998 23998 TABLE ACCESS FULL G_BIL_C_DAT_LTE_206_T_20180414 PARTITI
  30. ON: 1 2 (cr=957 pr=0 pw=0 time=67557 us cost=262 size=209742568 card=24031)

#trace文件中第二次Insert,四个列的插入操作:

  1. insert /*+ parallel(t,4) */ into yang.G_BIL_C_DATA_LTE_20180414 t (TICKET_ID,
  2. BSID,
  3. IPV6_PDSN_ADDRESS,
  4. RATABLE_RESOURCE_LIST) select trim(TICKET_ID),
  5. trim(BSID ),
  6. trim(IPV6_PDSN_ADDRESS ),
  7. trim(RATABLE_RESOURCE_LIST) from yang.G_BIL_C_DAT_LTE_206_T_20180414 t
  8.  
  9. call count cpu elapsed disk query current rows
  10. ------- ------ -------- ---------- ---------- ---------- ---------- ----------
  11. Parse 1 0.00 0.00 0 2 0 0
  12. Execute 1 0.28 0.31 0 1000 25794 23998
  13. Fetch 0 0.00 0.00 0 0 0 0
  14. ------- ------ -------- ---------- ---------- ---------- ---------- ----------
  15. total 2 0.28 0.31 0 1002 25794 23998
  16. #解析期间:库缓存中未命中:硬解析1次
  17. Misses in library cache during parse: 1
  18. Optimizer mode: ALL_ROWS
  19. Parsing user id: 54
  20. Number of plan statistics captured: 1
  21.  
  22. Rows (1st) Rows (avg) Rows (max) Row Source Operation
  23. ---------- ---------- ---------- ---------------------------------------------------
  24. 0 0 0 LOAD TABLE CONVENTIONAL (cr=1006 pr=0 pw=0 time=315302 us
  25. )
  26. 23998 23998 23998 PARTITION LIST ALL PARTITION: 1 2 (cr=957 pr=0 pw=0 time=
  27. 52444 us cost=261 size=53060448 card=24031)
  28. 23998 23998 23998 TABLE ACCESS FULL G_BIL_C_DAT_LTE_206_T_20180414 PARTITI
  29. ON: 1 2 (cr=957 pr=0 pw=0 time=47368 us cost=261 size=53060448 card=24031)

逻辑读、物理读、执行时间统计对比

10046

工具level1

逻辑读

query

物理读

disk

TIME

Elapsed(单位微秒)

1s=1,000,000微秒

Insert插入表的所有列(全表总计94个列)

1065

1

15.32

Insert插入表的四个列

1002

0

0.31

Autotrace

逻辑读

consistent gets

物理读

physical reads

TIME

时-分-秒

Insert插入表的所有列(全表总计94个列)

2057

1

00:00:04

Insert插入表的四个列

1081

0

00:00:04

=>对比结果进行分析,得出相应结论

结论一、以上两个工具查询的统计信息对比:

Insert操作,插入的列数量越多,消耗的逻辑读就越多,代价也越大

结论二、autotrace工具显示的时间不准确,从逻辑读降低一半,但是执行时间根本没有减少

=>工具使用对比:autotrace || 10046

使用autotrace操作更加简便,但是只能当前用户执行,当前用户下查看

使用10046,操作复杂一点,但是可以查看监控其它用户下执行的sql,且执行时间维度更加精确,收集的统计信息更多。

Insert插入不同的列数量,统计信息对比的更多相关文章

  1. Oracle性能优化之oracle里表、索引、列的统计信息

    一.表的统计信息 表的统计信息用于描述表的详细信息,包括记录数(num_rows).表块的数量(blocks).平均行长度(avg_row_len)等典型维度.这些维度可以通过数据字典表DBA_TAB ...

  2. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

  3. 全废话SQL Server统计信息(2)——统计信息基础

    接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...

  4. 基于Oracle的SQL优化(崔华著)-整理笔记-第5章“Oracle里的统计信息”

    第5章“Oracle里的统计信息” 详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括 Oracle数据库中各种统计信息的分类.含义.收集和查看方法,以及如何在Oracle数据库里正确 ...

  5. SQL Server统计信息:问题和解决方式

    在网上看到一篇介绍使用统计信息出现的问题已经解决方式,感觉写的很全面. 在自己看的过程中顺便做了翻译. 因为本人英文水平有限,可能中间有一些错误. 假设有哪里有问题欢迎大家批评指正.建议英文好的直接看 ...

  6. 使用analyze命令统计信息

    ① 搜集和删除索引.表和簇的统计信息② 验证表.索引和簇的结构③ 鉴定表和簇和行迁移和行链接针对analyze的搜集和删除统计信息功能而言Oracle推荐使用DBMS_STATS包来代替analyze ...

  7. Oracle中的统计信息

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

  8. MS SQL统计信息浅析下篇

       MS SQL统计信息浅析上篇对SQL SERVER 数据库统计信息做了一个整体的介绍,随着我对数据库统计信息的不断认识.理解,于是有了MS SQL统计信息浅析下篇. 下面是我对SQL Serve ...

  9. 收集oracle统计信息

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

随机推荐

  1. Activiti手动执行的应用(UserTask)

    工作流模拟某公司请假流程情景如下:   1.开发人员请假流程,如果开发人员请假,如果请假天数小于3天,组长批准,人事批准即可请假.   2.如果请假大约三天,需要项目经理或者产品经理批准,并且项目总监 ...

  2. Python装饰器--decorator

    装饰器 装饰器实质是一个函数,其作用就是在不改动其它函数代码的情况下,增加一些功能.如果我们需要打印函数调用前后日志,可以这么做 def log(func): print('%s is running ...

  3. dubbo 负载均衡

    在系统中可以启动多个 provider 实例,consumer 发起远程调用时,根据指定的负载均衡算法选择一个 provider. 在本机配置多个 provider,使用不同的端口: <dubb ...

  4. ActiveMQ的spring配置文件

    从官网copy出来,做了部分修改: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...

  5. Docker私有仓库介绍

    安装环境 Centos 7.4 64位 安装Docker yum install docker 说明:docker新版本的安装方式和以前不一样,这里只是为了能运行Harbar, 不展开. 安装Dock ...

  6. 苹果手机 disabled 的背景颜色没有

    解决方案 .class disabled{ background-color: rgb(235, 235, 228); opacity:1}

  7. CRF(Conditional Random Field)

    条件随机场是近几年自然语言处理领域常用的算法之一,常用于句法分析.命名实体识别.词性标注等.在我看来,CRF就像一个反向的隐马尔可夫模型(HMM),两者都是用了马尔科夫链作为隐含变量的概率转移模型,只 ...

  8. DLL的Export和Import及extern "C"

    今天使用Unrar.dll,在调用RARProcessFileW时,VS总是提示“error LNK2001: 无法解析的外部符号”. Unrar.dll中是使用 extern "C&quo ...

  9. Win10系列:C#应用控件基础5

    ListBox控件 上一小节介绍的ComboBox控件在外观上仅显示当前选中的选项,通过单击此控件文本框才能看到其他选项,而ListBox控件能够以列表形式始终显示选项.在ListBox控件中可以添加 ...

  10. asp.net mvc 笔记一

    webapi controller 中 action 名称 不能与 View controller  中的 action 名称相同,否则 Url.Action("actionName&quo ...