sql优化经验总结课件

上传人:494895****12427 文档编号:242022348 上传时间:2024-08-10 格式:PPT 页数:46 大小:300.55KB
返回 下载 相关 举报
sql优化经验总结课件_第1页
第1页 / 共46页
sql优化经验总结课件_第2页
第2页 / 共46页
sql优化经验总结课件_第3页
第3页 / 共46页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,www.si-,*,ORACLE SQL优化经验交流,系统支撑部 董建忠,1,www.si-,ORACLE SQL优化经验交流,第一章:概述,数据库优化的几个环节,什么样的SQL需要优化,常见的问题,发现问题的方法,2,www.si-,第一章:概述数据库优化的几个环节2www.si-tech.c,数据库优化的几个环节,物理存储IO均衡,数据库规划合理(参数、表空间分布),数据表和索引的设计,SQL语句的优化,3,www.si-,数据库优化的几个环节物理存储IO均衡3www.si-tech,什么样的SQL需要优化,引发严重的等待事件(IO、锁),消耗大量的系统资源(CPU/IO/MEM),运行时间超长(排序段、回滚段占用太大),不能满足压力测试指标,4,www.si-,什么样的SQL需要优化引发严重的等待事件(IO、锁)4www,常见的问题,没有恰当的索引(全表扫描问题),索引不适当(索引低效、无用),重编译问题(程序开发问题),多表关联条件不当或关联太多,分区表没有分析,未能使用索引(维护问题),死锁(应用逻辑问题),5,www.si-,常见的问题没有恰当的索引(全表扫描问题)5www.si-te,发现问题的方法,从v$session_wait查看等待事件,SQLPLUS使用AUTOTRACE查看执行计划,在TOAD中直接查看执行计划,从STATSPACK查看资源(CPU、I/O)消耗状况,生成SESSION TRACE文件(一般为DBA使用),用命令tkprof对TRACE文件进行分析,6,www.si-,发现问题的方法从v$session_wait查看等待事件6w,第二章:从等待事件中发现问题,查看SESSION WAIT的语句,典型事件:,Db File Sequential Read,典型事件:,Db File Sequential Read,典型事件:,Latch Free(,latch 释放),7,www.si-,第二章:从等待事件中发现问题查看SESSION WAIT的,查看SESSION WAIT 的语句,set pagesize 2000,set linesize 110,col event format a25,col program format a20,select a.event,substr(b.program,1,20)program,b.sid,a.p1,a.p2,a.p3,from gv$session_wait a,v$session b,where a.sid=b.sid and a.event not like%SQL%,and a.event not like%message%,and a.event not like%time%,8,www.si-,查看SESSION WAIT 的语句set pagesize,典型事件:Db File Scattered Read,数据文件分散读取,这种情况通常显示与全表扫描相关的等待。,一般表明该表找不到索引,或者只能找到有限的索引。,特定条件下执行全表扫描可能比索引扫描更有效,但如果出现这种等待时,最好检查一下这些全表扫描是否必要。,建议将小而常用的表CACHE到内存中,以避免一次又一次地重复读取它们,9,www.si-,典型事件:Db File Scattered Read 数,典型事件:,Db File Sequential Read,数据文件顺序读取,这一事件通常显示单个块的读取(如索引读取),表示表的连接顺序不佳,或者使用了不恰当的索引,检查每个扫描是否必要的,并检查多表连接的连接顺序,一般会消耗大量PGA内存,从而在顺序读取时导致大量等待。,10,www.si-,典型事件:Db File Sequential Read,典型事件:,Latch Free(,latch 释放),latch 是一种低级排队机制,用于保护系统全局区域(SGA)中共享内存结构。latch 就像是一种快速地被获取和释放的内存锁。latch 用于防止共享内存结构被多个用户同时访问。如果latch 不可用,就会记录latch 释放失败。,大多数latch 问题都与以下操作相关:不能使用绑定变量(库缓存latch)、重复生成问题(重复分配latch)、缓冲存储器竞争问题(缓冲器存储LRU 链),以及缓冲存储器中的“热”块(缓冲存储器链)。也有一些latch 等待与bug(程序错误)有关,当latch不命中率大于0.5%时,就应当研究这一问题,11,www.si-,典型事件:Latch Free(latch 释放)latc,第三章:SQL语句的执行计划,SQL语句的执行步骤,ORACLE的优化器,在SQLPLUS 配置AUTOTRACE,使用QUEST TOAD 查看执行计划,安装AUTOTRACE环境,使用QUEST TOAD 查看执行计划,查看执行计划,12,www.si-,第三章:SQL语句的执行计划SQL语句的执行步骤12www.,SQL 语句的执行步骤,语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。,语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。,视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。,表达式转换,将复杂的 SQL 表达式转换为较简单的等效连接表达式。,选择优化器,不同的优化器一般产生不同的“执行计划”,选择连接方式,ORACLE 有三种连接方式,对多表连接 ORACLE 可选择适当的连接方式。,选择连接顺序,对多表连接 ORACLE 选择哪一对表先连接,选择这两表中哪个表做为源数据表。,选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。,运行“执行计划”,13,www.si-,SQL 语句的执行步骤语法分析,分析语句的语法是否符合规范,ORACLE 的优化器,ORACLE 有两种优化器:基于规则的优化器(RBO,Rule Based Optimizer),和基于代价的优化器(CBO,Cost Based Optimizer),ORACLE V7以来缺省的设置应是“choose”,即如果对已分析的表查询的话选择CBO,否则选择RBO。如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制,各“执行计划”的 cost 的计算根据,依赖于数据表中数据的统计分布,须要分析表和相关的索引,才能搜集到 CBO 所需的数据,14,www.si-,ORACLE 的优化器 ORACLE 有两种优化器:基于规则,在SQLPLUS 配置AUTOTRACE,AUTOTRACE 参数,解 释,SET AUTOTRACE OFF,不能获得,AUTOTRACE报告,.这是默认的.,SET AUTOTRACE ON EXPLAIN,仅仅显示优化器执行计划的,AUTOTRACE,报告,SET AUTOTRACE ON STATISTICS,仅仅显示SQL语句执行的统计结果的,AUTOTRACE,报告,SET AUTOTRACE ON,包括上面两项内容的AUTOTRACE报告,SET AUTOTRACE TRACEONLY,与,SET,AUTOTRACE,ON类似,所有的统计和数据都在,但不可以打印,15,www.si-,在SQLPLUS 配置AUTOTRACEAUTOTRACE,安装AUTOTRACE环境,1、首先创建PLUSTRACE角色并且赋给DBA:,Sql$ORACLE_HOME/sqlplus/admin/plustrce.sql,Sql grant plustrace to public,2、赋权限给用户,SqlGRANT PLUSTRACE TO USER(预赋权的用户名);,3、以SYSTEM用户创建PLAN_TABLE表,Sql$ORACLE_HOME/rdbms/admin/utlplan.sql,Sql create public synonym plan_table for plan_table;,Sql grant all on plan_table to public;,在每个用户下设置AUTOTRACE可显示其执行计划。,16,www.si-,安装AUTOTRACE环境1、首先创建PLUSTRACE角,使用QUEST TOAD 查看执行计划,安装QUEST TOAD软件,建立数据库连接,进入SQL语句执行窗口,输入并选定SQL语句,在SQL-WINDOW菜单中选EXPLAIN PLAN CURRENT SQL,即可看到执行计划,,并不真正执行语句,不需要等待结果,17,www.si-,使用QUEST TOAD 查看执行计划安装QUEST TOA,查看执行计划,Execution Plan,-,0 SELECT STATEMENT Optimizer=CHOOSE,1 0 TABLE ACCESS(FULL)OF TEST,Statistics,-,0 recursive calls,0 db block gets,4 consistent gets,0 physical reads,0 redo size,547 bytes sent via SQL*Net to client,655 bytes received via SQL*Net from client,2 SQL*Net roundtrips to/from client,0 sorts(memory),0 sorts(disk),4 rows processed,18,www.si-,查看执行计划Execution Plan18www.si-t,第四章:如何分析问题的原因,查找原因的一般步骤,19,www.si-,第四章:如何分析问题的原因查找原因的一般步骤19www.si,查找原因的步骤(一),检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句,看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join(归并 SMJ)、Hash Join(散列HJ)和Nested Loop Join(嵌套循环 NL)。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响,20,www.si-,查找原因的步骤(一)检查被索引的列或组合索引的首列是否出现在,查找原因的步骤(二),看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引,表dept的列deptno上无索引,WHERE语句有emp.deptno=dept.deptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描,21,www.si-,查找原因的步骤(二)看连接顺序是否允许使用相关索引。假设表e,查找原因的步骤(三),是否用到系统数据字典表或视图。由于系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降,索引列是否函数的参数。如是,索引在查询时用不上,是否存在潜在的数据类型转换。如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致第六种现象的发生,22,www.si-,查找原因的步骤(三)是否用到系统数据字典表或视图。由于系统数,查找原因的步骤(四),需要定期分析表和索引,如果数据经常有增、删、改的表,最好定期对表和索引进行分析,可用SQL语句“analyze table xxxx compute statistics for all indexes;”。ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择,23,www.si-,查找原因的步骤(四)需要定期分析表和索引23www.si-t,查找原因的步骤(五),索引列的选择性不高,(字段值重复率高),假设有表emp,共有一百万行数据,但其中的emp.deptno列数据只有4种不同的值,如10、20、30、40。ORACLE缺省认定表中列的值是在所有数据行均匀分布的。假设SQL搜索条件DEPTNO=10,利用deptno列上的索引进行数据搜索效率,往往不比全表扫描的高,ORACLE因此对索引“视而不见”,认为该索引的选择性不高,24,www.si-,查找原因的步骤(五)索引列的选择性不高(字段值重复率高)2,查找原因的步骤(六),索引列值是否可为空,(NULL)。如果索引列值可以是空值,在SQL语句中那些需要返回NULL值的操作,将不会用到索引,如COUNT(*),而是用全表扫描。这是因为索引中存储值不能为全空,看是否有用到并行查询(PQO)。并行查询将不会用到索引,看PL/SQL语句中是否有用到bind变量。由于数据库不知道bind变量具体是什么值,在做非相等连接时,如“”,“like”等。ORACLE将引用缺省值,在某些情况下会对执行计划造成影响,25,www.si-,查找原因的步骤(六)索引列值是否可为空(NULL)。如果索引,第五章:SQL重编译问题,SQL共享原理,SQL共享的三个条件,PROC程序的SQL共享,PROC程序中以下类型的语句不需进行变量绑定,PROC程序的CLIENT参数,存储过程的SQL共享,SQL共享的数据库参数的利弊,26,www.si-,第五章:SQL重编译问题SQL共享原理26www.si-te,SQL共享原理,ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的 执行路径.这个功能大大地提高了SQL的执行性能并节省了内存的使用,27,www.si-,SQL共享原理 ORACLE将执行过的SQL语句存放在内存的,SQL共享的三个条件,当前被执行的语句和共享池中的语句必须完全相同(包括大小写、空格、换行等),两个语句所指的对象必须完全相同(同义词与表是不同的对象),两个SQL语句中必须使用相同的名字的绑定变量(bind variables),28,www.si-,SQL共享的三个条件当前被执行的语句和共享池中的语句必须完全,PROC程序的SQL共享,未使用绑定变量的语句,sprintf(sqlstr,insert into scott.test1(num1,num2)values(%d,%d),n_var1,n_var2);,EXEC SQL EXECUTE IMMEDIATE:sqlstr;,EXEC SQL COMMIT;,使用绑定变量的语句,strcpy(sqlstr,insert into test(num1,num2)values(:v1,:v2);,EXEC SQL PREPARE sql_stmt FROM:sqlstr;,EXEC SQL EXECUTE sql_stmt USING:n_var1,:n_var2;,EXEC SQL COMMIT;,动态表也可以使用以上方式避免重编译,29,www.si-,PROC程序的SQL共享 未使用绑定变量的语句29www.s,PROC程序中以下类型的语句不需进行变量绑定,for(i=0;i 50);,ANALYZE table TABLE_NAME ESTIMATE STATISTICS SAMPLE 50 PERCENT;,ORACLE9i建议使用dbms_stats.GATHER_TABLE_STATS,37,www.si-,表和索引的分析exec dbms_stats.GATHER_,分区表、索引的特点,分区表应尽量建立分区索引,分区表的主键索引若不包含分区字段,则只能建为全局索引,分区表和索引便于管理,但对于底层IO均匀的存储,并不能提高查询性能,分区表和索引需要定期分析,才能恰当的被执行计划使用,38,www.si-,分区表、索引的特点分区表应尽量建立分区索引38www.si-,第七章:杂项,39,www.si-,第七章:杂项39www.si-,IN和EXISTS,.where column in(select*from.where.);,.where exists(select X from.where.);,第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询,使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间,Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中,40,www.si-,IN和EXISTS.where column in(,IS NULL 与 IS NOT NULL,不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能,任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的,41,www.si-,IS NULL 与 IS NOT NULL 不能用null作,Order by语句,ORDER BY语句决定了Oracle如何将返回的查询结果排序,任何在Order by语句的非索引项或者有计算表达式都将降低查询速度,42,www.si-,Order by语句 ORDER BY语句决定了Oracle,用Where子句替换HAVING子句,避免使用HAVING子句,HAVING 只会在检索出所有记录之后才对结果集进行过滤.这个处理需要排序,总计等操作.如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销,43,www.si-,用Where子句替换HAVING子句避免使用HAVING子句,带通配符(%)的like语句,select*from employee where last_name like%cliton%;,select*from employee where last_name like c%;,第二句能够使用到字段last_name的索引,44,www.si-,带通配符(%)的like语句 select*from e,找使用CPU多的用户session,12是指被这个SESSION使用的CPU,select a.sid,spid,status,substr(a.program,1,40)prog,a.terminal,osuser,value/60/100 value,from v$session a,v$process b,v$sesstat c,where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;,45,www.si-,找使用CPU多的用户session12是指被这个SESS,典型SQL,select id_no,cust_id from dCustMsgDead,where phone_no=13844773080 and substr(run_code,2,1)=a,问题1:字符字段的phone_no没有加引号!,问题2:应该将该索引建成分区索引(表为分区表),问题3:组合索引中包含RUN_CODE毫无意义,应只含PHONE_NO字段,46,www.si-,典型SQLselect id_no,cust_id from,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!