当前位置:  数据库>oracle

通过绑定变量优化OLTP系统性能

    来源: 互联网  发布时间:2017-06-09

    本文导语: 之前给南京某客户优化一套OLTP数据库,其数据库中在某个时间段,会执行大量结构非常相似的查询语句,造成shared_pool被大量占用,导致数据库性能下降。碰到这种情况,其实最佳优化方案,就是让应用厂商修改相应代码,通过...

之前给南京某客户优化一套OLTP数据库,其数据库中在某个时间段,会执行大量结构非常相似的查询语句,造成shared_pool被大量占用,导致数据库性能下降。碰到这种情况,其实最佳优化方案,就是让应用厂商修改相应代码,通过增加绑定变量,来有效减少相似SQL语句执行时的硬解析数,降低对shared_pool的消耗。下面来做一个关于绑定变量的测试:
 
1.创建测试用户并赋予权限
[Oracle@zlm ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 11.2.0.3.0 Production on Sun Sep 14 14:47:32 2014
 
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
--创建用户
SQL> create user zlm identified by zlm;
 
User created.
 
--赋权限
SQL> grant dba to zlm;
 
Grant succeeded.
 
--创建表空间
SQL> create tablespace zlm datafile '/u01/app/oracle/oradata/zlm11g/zlm01.dbf' size 100m ;
 
Tablespace created.
 
--设置缺省表空间
SQL> alter user zlm default tablespace zlm;
 
User altered.
 
--连接用户
SQL> conn zlm/zlm
Connected.
 
--创建测试表
SQL> create table t1 as select object_id,object_name from dba_objects; 
 
Table created.
 
--创建索引
SQL> create index inx_t1_id on t1(object_id);
 
Index created.
 
--收集表的统计信息
SQL> 
 
PL/SQL procedure successfully completed.
 
2.不使用绑定变量的情况
--设置tracle文件标识符
SQL> alter session set ;
 
Session altered.
 
--开启sql_trace
SQL> alter session set ;
 
Session altered.
 
--执行PL/SQL程序段
SQL> begin  
  2  for s in 1..10000  
  3  loop  
  4  execute immediate ;  
  5  end loop;  
  6  end;  
  7  /
 
PL/SQL procedure successfully completed.
 
--关闭sql_trace
SQL> alter session set ;
 
Session altered.
 
SQL> !  
 
[oracle@zlm ~]$ cd /u01/app/oracle/diag/rdbms/zlm11g/zlm11g/trace/
[oracle@zlm trace]$ ll -lrth | grep ZLM01.trc
-rw-r----- 1 oracle oinstall 7.3M Sep 14 15:00 
[oracle@zlm trace]$ 
 
TKPROF: Release 11.2.0.3.0 - Development on Sun Sep 14 15:05:46 2014
 
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
 
 
[oracle@zlm trace]$ 
 
--查看用tkprof格式化后的日志zlm01.log最后一段
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
         0          0          0           0
         0          0          0           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
       0          0          0           0
 
Misses in library cache during parse: 10000
 
    0  internal SQL statements in session.
********************************************************************************
Trace file: 
Trace file compatibility: 11.1.0.7
Sort options: default
 
       1  session in tracefile.
       0  internal SQL statements in trace file.
     138  elapsed seconds in trace file.
 
分析:刚才的那段PL/SQL的语句被,CPU总共消耗了6.26+0.23=,花费时间6.53+0.26=,可以看到,在trace文件中共有90068行,由于同样结构的SQL语句,未使用绑定变量,使Oracle认为每个语句都不同,因此产生了非常多的SQL语句,zlm01.log日志文件大小约为。
 
2.使用绑定变量的情况
--清空shared_pool
SQL> 
 
System altered.
 
--设置tracle文件标识符
SQL> alter session set ;
 
Session altered.
 
--开启sql_trace
SQL> alter session set ;
 
Session altered.
 
--运行PL/SQL程序段
SQL> begin  
  2  for s in 1..10000  
  3  loop  
  4  execute immediate ;  
  5  end loop;  
  6  end;  
  7  /
 
PL/SQL procedure successfully completed.
 
--关闭sql_trace
SQL> alter session set sql_trace=false;
 
Session altered.
 
SQL> !
 
--再次查看用tkprof格式化以后的内容
[oracle@zlm trace]$ ll -lrth | grep ZLM02.trc
-rw-r----- 1 oracle oinstall  18K Sep 14 15:16 
[oracle@zlm trace]$ 
 
TKPROF: Release 11.2.0.3.0 - Development on Sun Sep 14 15:17:09 2014
 
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
 
 
[oracle@zlm trace]$ 
 
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
         0          0          0           0
       0          0          0           0
Fetch       19      0.00       0.00          0         47          0          12
------- ------  -------- ---------- ---------- ---------- ----------  ----------
         0         47          0          12
 
Misses in library cache during parse: 1
 
    4  user  SQL statements in session.
   12  internal SQL statements in session.
   16  SQL statements in session.
********************************************************************************
Trace file: 
Trace file compatibility: 11.1.0.7
Sort options: default
 
       1  session in tracefile.
      12  internal SQL statements in trace file.
     118  elapsed seconds in trace file.
 
分析:使用绑定变量以后,前后对比一下,资源消耗降低了非常多。,执行次数虽然多了15次,但CPU时间为,消耗时间为,基本可以忽略不计,trace文件中只有20156行,内容非常较之前要低了非常多,zlm02.log文件仅大小。
 
SQL> select  from  where sql_text like '%select * from t1 where object_id=%';
 
SQL_ID        SQL_TEXT                                           EXECUTIONS
------------- -------------------------------------------------- ----------

 
总结:在OLTP等报表系统中,当我们的应用中如果执行结构非常类似的语句:如,select * from t1 where object_id='10',select * from t1 where object_id='100',……如果不加绑定变量,会大大增加硬解析的次数,10000次执行,就有10000次硬解析(第一次执行时),如果再次执行,可能会因为在shared_pool缓存中已经存在,会有一部分软解析,而使硬解析数减少,而一旦使用了绑定变量,就算把shared_pool清空掉,也只需很少的几次硬解析,就可以执行10000次查询语句,大大减少了SGA中对shared_pool的占用,提高查询性能。如果在OLAP中,使用绑定变量需要谨慎,未必一定会提高性能,具体情况还需具体分析,这种情况仅仅适合OLTP系统。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过proc文件系统获取系统性能监测参数-代码实现
  • 解析一个通过添加本地分区索引提高SQL性能的案例
  • 通过proc文件系统获取系统性能监测参数
  • 通过JSP的预编译消除性能瓶颈
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • applet可以不通过数字签名,通过设置IE直接在本地访问本地文件吗
  • php通过socket_bind()设置IP地址代码示例
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()
  • 通过javascript库JQuery实现页面跳转功能代码
  • 紧急求救!能通过jdbc怎样连接sqlsever 然后通过 for xml 关键字得到xml流吗?
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 我想我的网站屏蔽掉通过某些网站过来的访问,我想通过htaccess 文件来做,请大家帮帮我。
  • linux下通过crond实现自动执行程序
  • 如何通过INTERNET访问通过共项一条线路上网的局域网中的机器???
  • 通过docker commit命令保存对docker容器的修改
  • 为什么g++编译通过了,而gcc却编译通过不了???
  • 通过docker run命令运行新的docker镜像
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • 通过docker ps命令检查运行中的docker镜像
  • Jbuilder第一次编译说缺包,引入通过!然后把原来引入的注释,又通过!上帝,救我!
  • Session id实现通过Cookie来传输方法及代码参考
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • 通过docker search命令搜索可用docker镜像
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠
  • Python3通过request.urlopen实现Web网页图片下载
  • 工作站Redhat Linux7.2如何通过NT4.0 proxy代理服务器上网,我不能通过其验证!请高手指点思路和方法!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,