ORACLE培训SQL性能优化课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《ORACLE培训SQL性能优化课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLE 培训 SQL 性能 优化 课件
- 资源描述:
-
1、ORACLEORACLE培训培训-SQL-SQL性能优化性能优化1.课程主要讨论:课程主要讨论:SQL语句执行的过程、语句执行的过程、ORACLE优化器优化器,表之间的关联,如何得到,表之间的关联,如何得到SQL执行执行计划,如何分析执计划,如何分析执行计划等内容,从而由浅到深的方式行计划等内容,从而由浅到深的方式了解了解SQL优化的过优化的过程,使大家逐步掌握程,使大家逐步掌握SQL优化。优化。2.n 优化基础知识优化基础知识n 性能调整综述性能调整综述n 有效的应用设计有效的应用设计n SQL语句的处理过程语句的处理过程n Oracle的优化器的优化器n Oracle的执行计划的执行计划n
2、 注意事项注意事项3.n定位有问题的语句定位有问题的语句n检查执行计划检查执行计划n检查执行过程中优化器的统计信息检查执行过程中优化器的统计信息n分析相关表的记录数、索引情况分析相关表的记录数、索引情况n改写改写SQL语句、使用语句、使用HINT、调整索引、调整索引、表分析表分析n有些有些SQL语句不具备优化的可能,需语句不具备优化的可能,需要优化处理方式要优化处理方式n达到最佳执行计划达到最佳执行计划4.n尽量简单,模块化尽量简单,模块化n易读、易维护易读、易维护n节省资源节省资源内存内存CPU扫描的数据块要少扫描的数据块要少少排序少排序n不造成死锁不造成死锁5.为什么要为什么要bind v
3、ariables?n字符级的比较字符级的比较:SELECT*FROM USER_FILES WHERE USER_NO=10001234;与与SELECT*FROM USER_FILES WHERE USER_NO=:BV1;n检查:检查:select name,executionsfrom v$db_object_cachewhere name like select*from user_files%6.什么叫做重编译问题什么叫做重编译问题什么叫做重编译?什么叫做重编译?下面这个语句每执行一次就需要在下面这个语句每执行一次就需要在SHARE POOL 硬解析一硬解析一次,一百万用户就是一百万
4、次,消耗次,一百万用户就是一百万次,消耗CPU和内存,如果业务和内存,如果业务量大,很可能导致宕库量大,很可能导致宕库如果绑定变量,则只需要硬解析一次,重复调用即可如果绑定变量,则只需要硬解析一次,重复调用即可select*from dConMsg where contract_no=320134840951397.绑定变量解决重编译问题绑定变量解决重编译问题未使用绑定变量的语句未使用绑定变量的语句sprintf(sqlstr,insert into scott.test1(num1,num2)values(%d,%d),n_var1,n_var2);EXEC SQL EXECUTE IMME
5、DIATE: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;8.绑定变量的注意事项绑定变量的注意事项注意:注意:1、不要使用数据库级的变量绑定参数、不要使用数据库级的变量绑定参数cursor_sharing来强来强制绑定,无论其值为制绑定,无论其值
6、为 force 还是还是similar2、有些带、有些带 0性能优于性能优于select count(*)from tab;尽量少嵌套子查询,这种查询会消耗大量的尽量少嵌套子查询,这种查询会消耗大量的CPU资源;对于有比较多资源;对于有比较多or运算的查询,建议分成多个查询,用运算的查询,建议分成多个查询,用union all联结起来联结起来.尽量多用尽量多用commit语句提交事务,可以及时释放资源、解语句提交事务,可以及时释放资源、解锁、释放日志空间、减少管理花费;在频繁的、性能要求比较高的锁、释放日志空间、减少管理花费;在频繁的、性能要求比较高的数据操作中,尽量避免远程访问,如数据库链等
7、,访问频繁的表可数据操作中,尽量避免远程访问,如数据库链等,访问频繁的表可以常驻内存:以常驻内存:alter tablecache;在在Oracle中动态执行中动态执行SQL,尽量用,尽量用execute方式,不用方式,不用dbms_sql包。包。23.sql 语句的编写原则和优化语句的编写原则和优化 n在编写在编写SQLSQL语句时我们应清楚优化器根语句时我们应清楚优化器根据何种原则来使用索引,这有助于写据何种原则来使用索引,这有助于写出高性能的出高性能的SQLSQL语句。语句。nSQLSQL语句的编写原则和语句的编写原则和SQLSQL语句的优化,语句的优化,请跟我一起学习以下几方面:请跟我
8、一起学习以下几方面:24.避免复杂的多表关联避免复杂的多表关联select from user_files uf,df_money_files dm,cw_charge_record ccwhere uf.user_no=dm.user_noand dm.user_no=cc.user_noand and not exists(select)?很难优化,随着数据量的增加性能的风很难优化,随着数据量的增加性能的风险很大。险很大。25.避免使用耗费资源的操作避免使用耗费资源的操作带有带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的的SQL语句会启动语句会启动SQ
9、L引擎执行耗费资源的排序引擎执行耗费资源的排序(SORT)功能功能.DISTINCT需要一次排序操作需要一次排序操作,而其他的至少需要执行两次而其他的至少需要执行两次排序排序.例如例如,一个一个UNION查询查询,其中每个查询都带有其中每个查询都带有GROUP BY子句子句,GROUP BY会触发嵌入排序会触发嵌入排序(NESTED SORT);这样这样,每个每个查询需要执行一次排序查询需要执行一次排序,然后在执行然后在执行UNION时时,又一个唯一又一个唯一排序排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入操作被执行而且它只能在前面的嵌入排序结束后才能开始执行排序结束后才能开
10、始执行.嵌入的排序的深度会大大影响查嵌入的排序的深度会大大影响查询的效率询的效率.通常通常,带有带有UNION,MINUS,INTERSECT的的SQL语句都可以语句都可以用其他方式重写用其他方式重写.26.例如例如:低效低效:SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO=E.DEPT_NO高效高效:SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS(SELECT X FROM EMP E WHERE E.DEPT_NO=D.DEPT_NO);用用EXIST
11、S替换替换DISTINCT27.用用UNION-ALL 替换替换UNION(if possible)当当SQL语句需要语句需要UNION两个查询结果集合时两个查询结果集合时,这两个结果集合会以这两个结果集合会以UNION-ALL的方式被合并的方式被合并,然后在输出最终结果前进行排序然后在输出最终结果前进行排序.举例举例:低效:低效:SELECT ACCT_NUM,BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE=31-DEC-95 UNION SELECT ACCT_NUM,BALANCE_AMT FROM DEBIT_TRANSACTIO
12、NS WHERE TRAN_DATE=31-DEC-95高效高效:SELECT ACCT_NUM,BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE=31-DEC-95 UNION ALL SELECT ACCT_NUM,BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE=31-DEC-9528.2.给优化器更明确的命令给优化器更明确的命令29.自动选择索引自动选择索引如果表中有两个以上(包括两个)索引,其中有一个唯一性如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一
13、性索引,而其他是非唯一性在这种情况下,在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯将使用唯一性索引而完全忽略非唯一性索引一性索引举例举例:SELECT ENAMEFROM EMPWHERE EMPNO=2326 AND DEPTNO =20;这里,只有这里,只有EMPNO上的索引是唯一性的,所以上的索引是唯一性的,所以EMPNO索索引将用来检索记录引将用来检索记录TABLE ACCESS BY ROWID ON EMP INDEX UNIQUE SCAN ON EMP_NO_IDX30.至少要包含组合索引的第一列至少要包含组合索引的第一列如果索引是建立在多个列上如果索引是建立在多个
14、列上,只有在它的第一个列只有在它的第一个列(leading column)被被where子句引用时子句引用时,优化器才会选择使用该索引优化器才会选择使用该索引.SQL create table multiindexusage(inda number,indb number,descr varchar2(10);Table created.SQL create index multindex on multiindexusage(inda,indb);Index created.SQL set autotrace traceonlySQL select*from multiindexusage
15、where inda=1;Execution Plan-0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS(BY INDEX ROWID)OF MULTIINDEXUSAGE 2 1 INDEX(RANGE SCAN)OF MULTINDEX(NON-UNIQUE)SQL select*from multiindexusage where indb=1;Execution Plan-0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS(FULL)OF MULTIINDEXUSAGE 很明显
16、很明显,当仅引用索引的第二个列时当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引优化器使用了全表扫描而忽略了索引31.避免在索引列上使用函数避免在索引列上使用函数WHERE子句中,如果索引列是函数的一部分优化器将不子句中,如果索引列是函数的一部分优化器将不使用索引而使用全表扫描使用索引而使用全表扫描举例举例:低效:低效:SELECT FROM DEPTWHERE SAL*12 25000;高效高效:SELECT FROM DEPTWHERE SAL 25000/12;32.避免使用前置通配符避免使用前置通配符WHERE子句中子句中,如果索引列所对应的值的第一个字符由通如果索引列所对应
17、的值的第一个字符由通配符配符(WILDCARD)开始开始,索引将不被采用索引将不被采用.SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE USER_NO LIKE%109204421;在这种情况下,在这种情况下,ORACLE将使用全表扫描将使用全表扫描.33.避免在索引列上使用避免在索引列上使用NOT通常,我们要避免在索引列上使用通常,我们要避免在索引列上使用NOT,NOT会产生在和在会产生在和在索引列上使用函数相同的影响索引列上使用函数相同的影响.当当ORACLE”遇到遇到”NOT,他他就就会停止使用索引转而执行全表扫描会停止使用索引转
18、而执行全表扫描.举例举例:低效低效:(这里这里,不使用索引不使用索引)SELECT FROM DEPT WHERE DEPT_CODE NOT=0;高效高效:(这里这里,使用了索引使用了索引)SELECT FROM DEPT WHERE DEPT_CODE 0;34.避免在索引列上使用避免在索引列上使用 IS NULL和和IS NOT NULL避免在索引中使用任何可以为空的列,避免在索引中使用任何可以为空的列,ORACLE将无法使用该将无法使用该索引索引 对于单列索引,如果列包含空值,索引中将不存在此记对于单列索引,如果列包含空值,索引中将不存在此记录录.对于复合索引,如果每个列都为空,索引中
19、同样不存在此对于复合索引,如果每个列都为空,索引中同样不存在此记录记录.如果至少有一个列不为空,则记录存在于索引中如果至少有一个列不为空,则记录存在于索引中如果唯一性索引建立在表的如果唯一性索引建立在表的A列和列和B列上列上,并且表中存在一条记并且表中存在一条记录的录的A,B值为值为(123,null),ORACLE将不接受下一条具有相同将不接受下一条具有相同A,B值(值(123,null)的记录)的记录(插入插入).然而如果所有的索引列都为然而如果所有的索引列都为空,空,ORACLE将认为整个键值为空而空不等于空将认为整个键值为空而空不等于空.因此你可以因此你可以插入插入1000条具有相同键
20、值的记录条具有相同键值的记录,当然它们都是空当然它们都是空!因为空值不存在于索引列中因为空值不存在于索引列中,所以所以WHERE子句中对索引列进行子句中对索引列进行空值比较将使空值比较将使ORACLE停用该索引停用该索引.任何在任何在where子句中使用子句中使用is null或或is not null的语句优化器是的语句优化器是不允许使用索引的。不允许使用索引的。35.避免出现索引列自动转换避免出现索引列自动转换当比较不同数据类型的数据时当比较不同数据类型的数据时,ORACLE自动对列进行简单自动对列进行简单的类型转换的类型转换.假设假设USER_NO是一个字符类型的索引列是一个字符类型的索
21、引列.SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE USER_NO=109204421这个语句被这个语句被ORACLE转换为转换为:SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE TO_NUMBER(USER_NO)=109204421 因为内部发生的类型转换因为内部发生的类型转换,这个索引将不会被用到这个索引将不会被用到!36.在查询时尽量少用格式转换在查询时尽量少用格式转换n如用如用 WHERE a.order_no=b.order_no n不用不用 WHERE TO_NU
22、MBER(substr(a.order_no,instr(b.order_no,.)-1)=TO_NUMBER(substr(a.order_no,instr(b.order_no,.)-1)37.3.减少访问次数减少访问次数38.减少访问数据库的次数减少访问数据库的次数当执行每条当执行每条SQL语句时语句时,ORACLE在内在内部执行了许多工作部执行了许多工作:解析解析SQL语句语句,估算索引的利用率估算索引的利用率,绑定绑定变量变量,读数据块等等读数据块等等.由此可见由此可见,减少访问数据库的次数减少访问数据库的次数,就能就能实际上减少实际上减少ORACLE的工作量的工作量.类比,工程实施
23、类比,工程实施39.使用使用DECODE来减少处理时间来减少处理时间例如例如:SELECT COUNT(*),SUM(SAL)FROMEMP WHERE DEPT_NO=0020 AND ENAME LIKESMITH%;SELECT COUNT(*),SUM(SAL)FROMEMP WHERE DEPT_NO=0030 AND ENAME LIKESMITH%;你可以用你可以用DECODE函数高效地得到相同结果函数高效地得到相同结果SELECT COUNT(DECODE(DEPT_NO,0020,X,NULL)D0020_COUNT,COUNT(DECODE(DEPT_NO,0030,X,N
24、ULL)D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL)D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL)D0030_SALFROM EMP WHERE ENAME LIKE SMITH%;40.减少对表的查询减少对表的查询在含有子查询的在含有子查询的SQL语句中语句中,要特别注意减少对表的查询要特别注意减少对表的查询.例如例如:低效低效 SELECT TAB_NAME FROM TABLES WHERE TAB_NAME=(SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION
25、=604)ANDDB_VER=(SELECT DB_VER FROM TAB_COLUMNS WHERE VERSION=604)高效高效 SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER)=(SELECT TAB_NAME,DB_VER)FROM TAB_COLUMNS WHERE VERSION=604)41.4.细节上的影响细节上的影响42.WHERE子句中的连接顺序子句中的连接顺序ORACLE采用自下而上的顺序解析采用自下而上的顺序解析WHERE子句子句,根据这个原根据这个原理理,当在当在WHERE子句中有多个表联接时,子句中有多个表
展开阅读全文