Oracle RDBMS SQL语句处理流程.ppt_第1页
Oracle RDBMS SQL语句处理流程.ppt_第2页
Oracle RDBMS SQL语句处理流程.ppt_第3页
Oracle RDBMS SQL语句处理流程.ppt_第4页
Oracle RDBMS SQL语句处理流程.ppt_第5页
免费预览已结束,剩余52页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,oracle rdbms sql语句处理流程,赵元杰 中程在线(北京)科技有限公司 2009.8,2019/2/5,oracle 数据库设计与性能,2/57,内容提要,优化有关的术语 一个银行业务处理流程 理解sql执行过程 关于cursor_sharing参数 监视sql area 的sql语句 调整sql步骤,2019/2/5,oracle 数据库设计与性能,3/57,性能有关术语,共享池概念回顾 : shared pool是sga的一部分,它是用来存放由应用用户发出的sql和pl/sql语句 ; shared pool由3个部件组成 : 库缓存(library cache)-用来存放应用用户刚发出的sql及pl/sql语句、存储过程、函数、包、触发器、同义词pl/sql包及java类库等对象信息 ; 数据字典(data dictionary cache)-表、列等信息存储在该区 ; 用户全局区(user global area)-使用共享服务器选件时,用户全局区才有用,用户全局区用于存放用户会话的应用,2019/2/5,oracle 数据库设计与性能,4/57,性能有关术语,oracle共享池库高速缓存工作方式: 用来缓存共享的sql statements 和pl/sql块,这些可以给所有的连接用户共享 由lru(最小使用最先淘汰算法)来管理 不是fifo(先进先出)算法管理! oracle如何知道你的sql语句是否在里面 先通过一个hash算法将statement text运算成一个hash数值 然后通过这个hash值在共享池中查找,2019/2/5,oracle 数据库设计与性能,5/57,性能有关术语,sql语句分析 sql语法分析(syntactical analysis) 语法正确性分析,如关键字拼写等 语义分析(semantic analysis) 当前用户访问表是否有权限等 存入共享池( shared pool ) 当前sql语句语法和语义正确后存储在sga的共享词内,可供当前会话再次使用或其他用户使用,2019/2/5,oracle 数据库设计与性能,6/57,性能有关术语,sql语句的hash值 sql语句在语义分析后,都产生一个叫sql hsah values的值 sql hsah values是由hash函数产生的,在数据库中相同的sql语句具有相同的hash值 oracle系统通过sql hash 值来判断某个语句是否出现过 运行过程中,可从v$sqltext查询到sql语句及其hash值:,sql select a.username “用户名“, a.sid “sid号“, a.serial# “序列号“, 2 b.id1 “id1“, c.sql_text “sql语句“ 3 from v$session a, v$lock b, v$sqltext c 4 where a.lockwait is not null and a.lockwait = b.kaddr 5 and a.sql_address = c.address 6* and a.sql_hash_value = c.hash_value ; 用户名 sid号 序列号 id1 sql语句 - - - - - inmon 18 57968 196685 update tst2 set sal=98765 where name=zyj,2019/2/5,oracle 数据库设计与性能,7/57,性能有关术语,sql语句重新加载 如果在shared pool中找不到当前会话所发出的sql语句,则oracle系统重新加载 重新加载的sql语句要做下面的工作: 语法正确性分析 如关键字拼写等,2019/2/5,oracle 数据库设计与性能,8/57,性能有关术语,v$libaraycache有关术语 命名空间:sql area, table/procedure, body, trigger 等 gets: (parse)每当一条语句被分析一次时,该语句对应的名称空间的gets加1 gethits : 分析时在对应的名称空间找到已经存在时加1,其分析后的代码和执行计划在内存中找到了,不再执行硬分析,直接使用 pins: (excution)每当一条语句执行一次时,该语句对应的名称空间的的pins加1 reloads: (parse)因为找到的分析代码版本已经过期或作废而被重新硬分析的次数 invalidations: 因为数据词典发生变化,该语句被标记成失效,被迫重新做硬分析的次数,2019/2/5,oracle 数据库设计与性能,9/57,性能有关术语,绑定变量 绑定变量就是将类似的sql语句的变化部分采用变量替代,从而减少oracle系统类似语句的重新分析(硬分析) 如果采用绑定变量,系统只做软分析工作 sql语句硬分析原因: 没有共享的sql(没有使用绑定变量), 共享sql重新硬分析了(查询v$sqlarea的parse_calls和excutions字段,如果某个sql对应的parse_calls接近excutions数,说明该sql经常被重新硬分析) 注意:并不是绑定变量就是最好,2019/2/5,oracle 数据库设计与性能,10/57,性能有关术语,共享光标(cursor_sharing) 绑定变量原因: 没有共享的sql 硬分析 注意:并不是绑定变量就是最好,2019/2/5,oracle 数据库设计与性能,11/57,性能有关术语,sql语句执行计划 cost指cbo中这一步所耗费的资源,这个值是相对值 card是指计划中这一步所处理的行数 bytes指cbo中这一步所处理所有记录的字节数,是估算出来的一组值。,2019/2/5,oracle 数据库设计与性能,12/57,内容提要,优化有关的术语 一个银行业务处理流程 理解sql执行过程 关于cursor_sharing参数 监视sql area 的sql语句 调整sql步骤,2019/2/5,oracle 数据库设计与性能,13/57,1 发出查询余款的sql语句,如: 先查询帐户余额: sql语句通过sga得到服务器进程; 服务器进程检查共享池中有无该条语句,无该语句则将放置共享池中并准备运行; 执行sql语句,把存放有余款的数据块从数据文件中读到sga的数据高速缓冲区; 显示结果,比如余款为$325。,select account_balance from banktable where account_number=111222333 and account_type=savings;,一个银行业务处理流程,2019/2/5,oracle 数据库设计与性能,14/57,2 取款$25:sql语句为: 取款就是修改当前帐户的余额: 1.客户进程通过sga把sql语句传给服务器进程; 2.服务器进程查找有无该条语句,有执行; 3.分析sql语句并存入共享池; 4.执行sql语句; 5.要处理的数据在数据高速缓冲区吗?是转7; 6.从数据文件中读数据块到数据高速缓冲区; 7.在回滚段中记录原来的数值($325); 8.在重做日志中生成该事务的一个拷贝; 9.将数据高速缓冲区中的余额改为$300; 10.银行柜员机通过sga发出工作完成信号(提交): 11.在重做日志中记录已完成事务; 12.清除回滚段中的恢复信息(undo information); 13.顾客取钱完成。,update bank_table set account_balanct=300 where account_number=111222333 and account_type=savings;,一个银行业务处理流程,2019/2/5,oracle 数据库设计与性能,15/57,内容提要,优化有关的术语 一个银行业务处理流程 理解sql执行过程 关于cursor_sharing参数 监视sql area 的sql语句 调整sql步骤,2019/2/5,oracle 数据库设计与性能,16/57,sql语句从发出到执行的主要流程:,sql 语句处理流程,2019/2/5,oracle 数据库设计与性能,17/57,sql语句执行基本流程:,sql 语句处理流程,2019/2/5,oracle 数据库设计与性能,18/57,多表连接的sql语句执行流程:,sql 语句处理流程,2019/2/5,oracle 数据库设计与性能,19/57,sql执行过程-三项主要工作,分析(parsing) 优化(optimization) 执行(execution),2019/2/5,oracle 数据库设计与性能,20/57,sql执行过程-分析,语法分析(syntactical analysis) 语义分析(semantic analysis) 存入共享池( shared pool ),2019/2/5,oracle 数据库设计与性能,21/57,sql执行过程: 1.语法分析,各表示符号查询 / 建议语法,select ename, job, d.deptno, dname from emp e dept d where e.deptno = d.deptno and e.job = “clerk“ order deptno,2019/2/5,oracle 数据库设计与性能,22/57,sql执行过程: 2.语义分析,解决引用关系 (锁-latches) 检验权限,select ename, job, d.deptno, dname from emp e, dept d where e.deptno = d.deptno and e.job = clerk order by deptno,scott.emp (table) ename job deptno ,scott.dept (table) deptno dname ,schema scott,data dictionary,2019/2/5,oracle 数据库设计与性能,23/57,sql执行过程: 3a. 进入共享池,转化为hash sql 并共享池中查到,select ename, job, d.deptno, dname from emp e, dept d where e.deptno = d.deptno and e.job = clerk order by d.deptno,628938992,hash,system global area,shared pool,shared sql area,user 1,user 2,user 3,oracle instance,4,2019/2/5,oracle 数据库设计与性能,24/57,sql执行过程: 3a.共享池工作,如果共享池没找到就加载到共享池,select ename, job, d.deptno, dname from emp e, dept d where e.deptno = d.deptno and e.job = clerk order by d.deptno,628938992,v$sql (data dictionary view into sql in shared pool) hash_value sql_text - - 619739417 select count(*) from user_policies v where v.ob. 619739417 select count(*) from user_policies v where v.ob. 628938992 select ename, job, e.deptno, dname from emp e, d. 636388251 insert into ccol$(con#,obj#,intcol#,pos#,col#) val. .,hash,5,6,2019/2/5,oracle 数据库设计与性能,25/57,sql执行过程: 优化,final execution plan / row source generator 0 select statement optimizer=choose 1 0 merge join 2 1 sort (join) 3 2 table access (full) of dept 4 1 sort (join) 5 4 table access (full) of emp,select ename, job, d.deptno, dname ,data dictionary,评估不同访问路径 (包括 latches) 确定最佳路径,并保持在共享池中,optimizer,plan a : cost = 5,plan b : cost = 3,plan c : cost = 10,2019/2/5,oracle 数据库设计与性能,26/57,sql执行过程: 执行,在私有 sql 区分配光标 绑定变量-bind values 运行光标 insert/update/delete 锁 / 修改 select 识别活动数据集( active-set ) 从光标中返回数据 关闭光标,2019/2/5,oracle 数据库设计与性能,27/57,sql执行过程-要点,sql语句的执行要经过下面的步骤: 解析sql-在共享池中找该语句;检查语法;执行和返回结果; 解析sql : 检查安全性; 检查sql语法; 可能sql语句重写。 执行: 创建执行计划; 捆绑执行计划; 执行计划执行; 取出结果。 显示结果-包括排序、转换和重格式化; 转换结果集-对内置函数的结果进行转换。,2019/2/5,oracle 数据库设计与性能,28/57,sql执行过程-要点,sql语句的解析: 接收sql到共享池;检查语法等; 重新书写查询(query rewrite) : 如果创建了实体视图(enable query rewrite); alter session set query_rewrite_enabled=true; 该sql语句采用查询重写(见实体视图)。 oracle 的 cursor_sharing参数: force -除变量外语句完全相同使用同一个光标; exact(默认)-语句完全相同使用同一个光标; 9i/10g/11g 增加similar参数,强制共享只有文字不同的语句解释计划。,2019/2/5,oracle 数据库设计与性能,29/57,sql执行过程-要点,生成执行计划: 优化器职能是决定最有效方法为查询服务; 查询速度和查询效率 : 最大速度(first_rows)重点是最短时间返回结果; 最小的资源(all_rows)使用最少的机器资源和磁盘资源; 优化器模式由optimizer_mode参数决定: cbo-oracle通过运行analyze分析的统计数据; rbo-oracle使用数据字典中的索引的信息; oracle 的optimizer_mode=choose;没有统计数据,则使用rbo,否则使用cbo; oracle 10g 默认optimizer_mode = all_rows。,2019/2/5,oracle 数据库设计与性能,30/57,sql执行过程-性能统计(1),tkprof,select ename, job, d.deptno, dname from emp e, dept d where e.deptno = d.deptno and e.job = clerk order by d.deptno call count cpu elapsed - - - - parse 1 0.01 0.01 execute 1 0.00 0.00 fetch 2 0.00 0.00 - - - - total 4 0.01 0.01,2,2019/2/5,oracle 数据库设计与性能,31/57,sql执行过程-性能统计(2),select count(*) from big_user_table 22739 call count cpu elapsed - - - - parse 1 0.07 0.08 execute 1 0.00 0.00 fetch 2 0.95 1.12 - - - - total 4 1.02 1.21,2019/2/5,oracle 数据库设计与性能,32/57,sql执行过程-性能统计(3),select username from big_user_table where id = 100 call count cpu elapsed - - - - parse 1 0.08 0.07 execute 1 0.00 0.00 fetch 2 0.00 0.00 - - - - total 4 0.08 0.07,(分析工作代价相当高.),2019/2/5,oracle 数据库设计与性能,33/57,sql执行过程-共享池快速分析,最优保持执行计划,select username from big_user_table where id = 100,298300393,v$sql (data dictionary view into sql in shared pool) hash_value sql_text - - 2591785020 select obj#,type#,ctime,mtime,stime,status,dataobj. 2591785020 select obj#,type#,ctime,mtime,stime,status,dataobj. 298300393 select username from big_user_table where object. 4049165760 select order#,columns,types from access$ where d_o. .,hash,2019/2/5,oracle 数据库设计与性能,34/57,sql执行过程-硬分析与软分析,硬分析与软分析(hard-parse vs. soft-parse): hard parse-对sql语句进行语法检查和语义分析,并生成执行计划和执行编码; soft parse-对sql语句进行语法检查和语义分析,2019/2/5,oracle 数据库设计与性能,35/57,sql执行过程-软分析更好,-after added to shared pool -executed 4 times in a *new* session: select username from big_user_table where object_id = 100 call count cpu elapsed - - - - parse 4 0.00 0.00 execute 4 0.00 0.00 fetch 8 0.01 0.00 - - - - total 16 0.01 0.00,软分析代价较小,2019/2/5,oracle 数据库设计与性能,36/57,sql执行过程-软分析不足,select username from big_user_table where id = 100; select username from big_user_table where object_id = 250;,298300393,v$sql (data dictionary view into sql in shared pool) hash_value sql_text - - 2591785020 select obj#,type#,ctime,mtime,stime,status,dataobj. 2591785020 select obj#,type#,ctime,mtime,stime,status,dataobj. 1737037929 select object_name from all_objects where objec. 298300393 select object_name from all_objects where object. 4049165760 select order#,columns,types from access$ where d_o. .,1737037929,hash,hash,2019/2/5,oracle 数据库设计与性能,37/57,在共享池中重用sql语句: 当sql语句被传递给oracle处理时,关键是重复使用已经在共享池中的语句,而不是让oracle在接受语句时去准备新的语句; 与共享池中的语句相一致的语句,就重用共享池中的语句; oracle提供在数据库中存储代码的能力,当应用系统开始运行时,从数据库中读取代码(可用pl/sql语句编制)并传递到共享池中去处理。从数据库中取出的代码是编译过的并驻留在共享池中; 利用数据库中存储的程序代码设计应用系统,检查所有的事务处理以及主要的通用的过程,研究现有的应用系统并把主要的处理程序转换为数据库中存储的程序代码。在oracle中存储代码可以通过过程、程序包、函数、触发器等来实现 。,sql代码的重用,2019/2/5,oracle 数据库设计与性能,38/57,内容提要,一个银行业务处理流程 理解sql执行过程 关于cursor_sharing参数 监视sql area 的sql语句 调整sql步骤,2019/2/5,oracle 数据库设计与性能,39/57,cursor_sharing参数,与shraed_pool_size有关 什么是shared_pool shared_pool分为两个部分 第一部分为库高速缓存 第二部分为字典高速缓存 pl/sql程序分析后存放在库高速缓存 共享池由shared_pool_size参数设置,2019/2/5,oracle 数据库设计与性能,40/57,cursor_sharing参数-不同sql,select name, address from app.employee; select name, address from app.employee; select name, address from employee; select address from emp where name = emke, larry; select address from emp where name = drake, rick; select address from emp where name = :emp; select sysdate from dual; select to_char(sysdate, dd-mon-yy) from dual;,2019/2/5,oracle 数据库设计与性能,41/57,cursor_sharing参数,cursor_sharing 可能的值: force exact (default) similar (oracle9i/10g/11g) cursor_sharing 有三种修改: alter system alter session spfile(或initsid.ora) cursor_sharing_exact提示,2019/2/5,oracle 数据库设计与性能,42/57,cursor_sharing参数,8i r2开始引入cursor_sharing参数 8i设置cursor_sharing=force和exact(默认) 9i增加similar参数值 默认值是exact-它只允许完全相同文本的语句共享一个游标。这是早期版本的行为; similar参数值使相似语句共享同样的游标,而不危及执行计划的安全。例如:只有最优共享语句共享游标; force会强迫oracle对相似语句共享游标,但存在非最优执行计划的风险,如,最优共享和非最优共享语句会共享同一个游标。,sql select * from mytable where name=tom sql select * from mytable where name=turner,2019/2/5,oracle 数据库设计与性能,43/57,cursor_sharing_exact提示,cursor_sharing_exact提示被用于在语句级控制游标共享; 这个标记类似于初始化参数cursor_sharing被设置为exact,并屏蔽原来的初始化参数 它导致语句共享采用精确匹配构建的游标。 下面例子(见下一页):,2019/2/5,oracle 数据库设计与性能,44/57,cursor_sharing_exact提示,cursor_sharing_exact例子 下面例子使用提示:,alter system set cursor_sharing=similar scope=both; - as the client run two similar sql statements select latitude from uwclass.servers where srvr_id =1; select latitude from uwclass.servers where srvr_id =2; select latitude from uwclass.servers where srvr_id =3; select address, child_address, sql_text, sql_id from gv$sql where sql_fulltext like %uwclass%; select /*+ cursor_sharing_exact */ latitude from uwclass.servers where srvr_id = 3; select address, child_address, sql_text, sql_id from gv$sql where sql_fulltext like %uwclass%; ,2019/2/5,oracle 数据库设计与性能,45/57,内容提要,一个银行业务处理流程 理解sql执行过程 关于cursor_sharing参数 监视sql area 的sql语句 调整sql步骤,2019/2/5,oracle 数据库设计与性能,46/57,监视sql area 的sql语句,v$sysstat 显示 oracle cpu 所有会话情况 v$sesstat 显示每个会话对 oracle cpu 使用情况 v$sqlarea 显示目前运行的sql语句基本情况,2019/2/5,oracle 数据库设计与性能,47/57,监视sql area 的sql语句,查询过分分析的语句: 高的百分比表明cpu花在分析语句上而不是执行上. pl/sql程序应该采用绑定变量; 加大shared_pool配置,select s1.value / s2.value * 100 from v$sysstat s1, v$sysstat s2 where = parse time cpu and = cpu used by this session;,2019/2/5,oracle 数据库设计与性能,48/57,监视sql area 的sql语句,查询频繁重分析的语句: 如果分析接近执行数,则表明每个语句在执行时都被分析一次.,select sql_text, parse_calls, executions from v$sqlarea order by parse_calls desc;,2019/2/5,oracle 数据库设计与性能,49/57,监视sql area 的sql语句,下面查询结果应该比较低. 表示语句不用重分析就可执行.,select s1.value / s2.value from v$sysstat s1, v$sysstat s2 where = parse count (hard) and = execute count ;,2019/2/5,oracle 数据库设计与性能,50/57,监视sql area 的sql语句,本地频繁分析的语句: 如果存在很高的类似的语句,可采用绑定变量.,select substr(sql_text,1,40), count(*) from v$sqlarea group by substr(sql_text,1,40) having count(*) 3 order by 2 desc;,2019/2/5,oracle 数据库设计与性能,51/57,监视sql area 的sql语句,能从缓冲区得到哪些sql 语句在使用cpu 50000 是一个随意给定的点. 用 explain 或跟踪可得到.,select buffer_gets, executions, buffer_gets/executions ratio, sql_text, address, hash_value from v$sqlarea where buffer_gets 50000 and executions 0 order by 3 desc ;,2019/2/5,oracle 数据库设计与性能,52/57,监视sql area 的sql语句,找

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论