书签 分享 收藏 举报 版权申诉 / 76
上传文档赚钱

类型ORACLE培训SQL性能优化课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4821497
  • 上传时间:2023-01-14
  • 格式:PPT
  • 页数:76
  • 大小:431.02KB
  • 【下载声明】
    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子句中有多个表联接时,子句中有多个表

    26、联接时,WHERE子句中排子句中排在最后的表应当是返回行数可能最少的表,有过滤条件的子在最后的表应当是返回行数可能最少的表,有过滤条件的子句应放在句应放在WHERE子句中的最后。子句中的最后。n如:设从如:设从emp表查到的数据比较少或该表的过滤条件比较确定,能大表查到的数据比较少或该表的过滤条件比较确定,能大大缩小查询范围,则将最具有选择性部分放在大缩小查询范围,则将最具有选择性部分放在WHERE子句中的最后:子句中的最后:select*from emp e,dept d where d.deptno 10 and e.deptno=30;n如果如果dept表返回的记录数较多的话,上面的查询

    27、语句会比下面的查询表返回的记录数较多的话,上面的查询语句会比下面的查询语句响应快得多。语句响应快得多。select*from emp e,dept d where e.deptno=30 and d.deptno 10;43.WHERE子句子句 函数、表达式使用函数、表达式使用n最好不要在最好不要在WHERE子句中使用函或表子句中使用函或表达式,如果要使用的话,最好统一使达式,如果要使用的话,最好统一使用相同的表达式或函数,这样便于以用相同的表达式或函数,这样便于以后使用合理的索引。后使用合理的索引。44.Order by语句语句 nORDER BY语句决定了语句决定了Oracle如何将返回的

    28、查询如何将返回的查询结果排序。结果排序。Order by语句对要排序的列没有什么语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或特别的限制,也可以将函数加入列中(象联接或者附加等)。者附加等)。任何在任何在Order by语句的非索引项或语句的非索引项或者有计算表达式都将降低查询速度。者有计算表达式都将降低查询速度。n仔细检查仔细检查order by语句以找出非索引项或者表达语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是式,它们会降低性能。解决这个问题的办法就是重写重写order by语句以使用索引,也可以为所使用语句以使用索引,也可以为所使用的列建立另

    29、外一个索引,同时应绝对避免在的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。子句中使用表达式。45.联接列联接列 对于有联接的列,即使最后的联接值为一个静态值,优化器对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。是不会使用索引的。select*from employss where first_name|last_name=Beill Cliton;系统优化器对基于系统优化器对基于last_name创建的索引没有使用。创建的索引没有使用。当采用下面这种当采用下面这种SQL语句的编写,语句的编写,Oracle系统就可以采用基系统就可以采用基于于la

    30、st_name创建的索引。创建的索引。select*from employee where first_name=Beill and last_name=Cliton;46.带通配符(带通配符(%)的)的like语句语句 通配符(通配符(%)在搜寻词首出现,)在搜寻词首出现,Oracle系统不使用系统不使用last_name的索引。的索引。select*from employee where last_name like%cliton%;在很多情况下可能无法避免这种情况,但是一定要心中有底在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字,

    31、通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:引得到了使用:select*from employee where last_name like c%;47.用用Where子句替换子句替换HAVING子句子句避免使用避免使用HAVING子句子句,HAVING 只会在检索出所有记录之后才对结果只会在检索出所有记录之后才对结果集进行过滤集进行过滤.这个处理需要排序这个处理需要排序,总计等操作总计等操作.如果能通过如果能通过WHERE子句限子句限制记录的数目制记录的数目,那就能减少

    32、这方面的开销那就能减少这方面的开销.例如例如:低效低效:SELECT REGION,AVG(LOG_SIZE)FROM LOCATION GROUP BY REGION HAVING REGION REGION!=SYDNEY AND REGION!=PERTH 高效高效 SELECT REGION,AVG(LOG_SIZE)FROM LOCATION WHERE REGION REGION!=SYDNEY AND REGION!=PERTH GROUP BY REGION 顺序顺序 WHERE GROUP HAVING48.用用NOT EXISTS 替代替代 NOT IN在子查询中在子查询中

    33、,NOT IN子句将执行一个内部的排序和合并子句将执行一个内部的排序和合并.无论在哪种情况无论在哪种情况下下,NOT IN都是最低效的都是最低效的(因为它对子查询中的表执行了一个全表遍历因为它对子查询中的表执行了一个全表遍历).使用使用NOT EXISTS 子句可以有效地利用索引。尽可能使用子句可以有效地利用索引。尽可能使用NOT EXISTS来代替来代替NOT IN,尽管二者都使用了,尽管二者都使用了NOT(不能使用索引而降低速度),(不能使用索引而降低速度),NOT EXISTS要比要比NOT IN查询效率更高。查询效率更高。例如例如:语句语句1 SELECT dname,deptno F

    34、ROM dept WHERE deptno NOT IN(SELECT deptno FROM emp);语句语句2 SELECT dname,deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno=emp.deptno);2 2要比要比1 1的执行性能好很多。的执行性能好很多。因为因为1 1中对中对empemp进行了进行了full table scan,full table scan,这是很浪费时间的操作。而且这是很浪费时间的操作。而且1 1中中没有用到没有用到empemp的的indexindex

    35、,因为没有因为没有wherewhere子句。而子句。而2 2中的语句对中的语句对empemp进行的是进行的是缩小范围的查询。缩小范围的查询。49.用索引提高效率用索引提高效率索引是表的一个概念部分索引是表的一个概念部分,用来提高检索数据的效率,用来提高检索数据的效率,ORACLE使使用了一个复杂的自平衡用了一个复杂的自平衡B-tree结构结构.通常通常,通过索引查询数据比全表通过索引查询数据比全表扫描要快扫描要快.当当ORACLE找出执行查询和找出执行查询和Update语句的最佳路径时语句的最佳路径时,ORACLE优化器将使用索引优化器将使用索引.同样在联结多个表时使用索引也可以同样在联结多个

    36、表时使用索引也可以提高效率提高效率.另一个使用索引的好处是另一个使用索引的好处是,它提供了主键它提供了主键(primary key)的唯一性验证。的唯一性验证。通常通常,在大型表中使用索引特别有效在大型表中使用索引特别有效.当然当然,你也会发现你也会发现,在扫描小在扫描小表时表时,使用索引同样能提高效率使用索引同样能提高效率.虽然使用索引能得到查询效率的提虽然使用索引能得到查询效率的提高高,但是我们也必须注意到它的代价但是我们也必须注意到它的代价.索引需要空间来存储索引需要空间来存储,也需要也需要定期维护定期维护,每当有记录在表中增减或索引列被修改时每当有记录在表中增减或索引列被修改时,索引本

    37、身也索引本身也会被修改会被修改.这意味着每条记录的这意味着每条记录的INSERT,DELETE,UPDATE将为将为此多付出此多付出4,5 次的磁盘次的磁盘I/O.因为索引需要额外的存储空间和处理因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引。定期的重构索引是有必要的。是有必要的。50.避免在索引列上使用计算避免在索引列上使用计算WHERE子句中,如果索引列是函数的一部分优子句中,如果索引列是函数的一部分优化器将不化器将不使用索引而使用全表扫描使用索引而使用全表扫描 低效:低效:SELECT FROM DEP

    38、T WHERE SAL*12 25000;高效高效:SELECT FROM DEPT WHERE SAL 25000/12;51.用用=替代替代 如果如果DEPTNO上有一个索引。上有一个索引。高效高效:SELECT*FROM EMP WHERE DEPTNO=4 低效低效:SELECT*FROM EMP WHERE DEPTNO 352.通过使用通过使用=、=等,避免使用等,避免使用NOT命令命令n例子:例子:select*from employee where salary 3000;n对这个查询,可以改写为不使用对这个查询,可以改写为不使用NOT:select*from employee

    39、 where salary3000;虽然这两种查询的结果一样,但是第二种查询方案会比第虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许一种查询方案更快些。第二种查询允许Oracle对对salary列列使用索引,而第一种查询则不能使用索引。使用索引,而第一种查询则不能使用索引。53.如果有其它办法,不要使用子查如果有其它办法,不要使用子查询。询。54.用用TRUNCATE替代替代DELETE当删除表中的记录时当删除表中的记录时,在通常情况下在通常情况下,回滚段回滚段(rollback segments)用来存放可以被恢复的信息用来存放可以被恢复的信息.如果你没

    40、如果你没有有COMMIT事务事务,ORACLE会将数据恢复到删除之前的会将数据恢复到删除之前的状态状态(准准确地说是恢复到执行删除命令之前的状况确地说是恢复到执行删除命令之前的状况)而当运用而当运用TRUNCATE时时,回滚段不再存放任何可回滚段不再存放任何可被恢复的被恢复的信息信息.当命令运行后当命令运行后,数据不能被恢复数据不能被恢复.因此很少的资因此很少的资源被调用源被调用,执行时间也会很短执行时间也会很短.55.比如有的表比如有的表PHONE_NO字段是字段是CHAR型型,而且创建有索引,而且创建有索引,但在但在WHERE条件中忘记了加引号,就条件中忘记了加引号,就不会用到索引。不会用

    41、到索引。WHERE PHONE_NO=13920202022WHERE PHONE_NO=13920202022字符型字段的引号字符型字段的引号56.优化优化EXPORT和和IMPORT使用较大的使用较大的BUFFER(比如比如10MB,10,240,000)可以提高可以提高EXPORT和和IMPORT的速度的速度;ORACLE将尽可能地获取你所指定的内将尽可能地获取你所指定的内存大小存大小,即使在内存即使在内存不满足不满足,也不会报错也不会报错.这个值至少要和表这个值至少要和表中最大的列相当中最大的列相当,否则否则列值会被截断列值会被截断;57.*优化优化 Tools*58.优化器与执行计划

    42、优化器与执行计划Oracle在执行一个在执行一个SQL之前之前,首先要分析一下语句的执行计首先要分析一下语句的执行计划划,然后再按执行计划去执行。分析语句的执行计划的工作然后再按执行计划去执行。分析语句的执行计划的工作是由优化器是由优化器(Optimizer)来完成的来完成的 Oracle的优化器共有两种的优化方式的优化器共有两种的优化方式,即即基于规则的优化方基于规则的优化方式式(Rule-Based Optimization,简称为简称为RBO)和和基于代价的优基于代价的优化方式化方式(Cost-Based Optimization,简称为简称为CBO)。A、RBO方式:优化器在分析方式:

    43、优化器在分析SQL语句时语句时,所遵循的是所遵循的是Oracle内部预定内部预定 的一些规则。比如我们常见的的一些规则。比如我们常见的,当一个当一个where子句中的一列有索引时去走子句中的一列有索引时去走索引。索引。B、CBO方式:是看语句的代价方式:是看语句的代价(Cost)了了,这里的代价主要指这里的代价主要指Cpu和内存和内存。优化器在判断是否用这种方式时。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息,主要参照的是表及索引的统计信息,很多的时侯过期统计信息会令优化器做出一个错误的执行计划在很多的时侯过期统计信息会令优化器做出一个错误的执行计划在Oracle8及以后的版本

    44、及以后的版本,Oracle推荐用推荐用CBO的方式。的方式。在在Oracle10g中中,取消了取消了RBO的支持。的支持。59.优化器与执行计划优化器与执行计划Rule:即走基于规则的方式即走基于规则的方式Choose:默认的情况下默认的情况下Oracle用的便是这种方式。当一个表或或索引有用的便是这种方式。当一个表或或索引有统计信息统计信息,则走则走CBO的方式的方式,如果表或索引没统计信息如果表或索引没统计信息,表又不是特别的小表又不是特别的小,而且相应的列有索引时而且相应的列有索引时,那么就走索引那么就走索引,走走RBO的方式的方式First Rows:它与它与Choose方式是类似的方

    45、式是类似的,所不同的是当一个表有统计信息所不同的是当一个表有统计信息时时,它将是以最快的方式返回查询的最先的几行它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时从总体上减少了响应时间间All Rows:all_rows是是oracle优化器默认的模式优化器默认的模式,它将选择一种在最短时它将选择一种在最短时间内返回所有数据的执行计划间内返回所有数据的执行计划,它将基于整体成本的考虑它将基于整体成本的考虑.first_rows_n:first_rows_n是根据成本而不是基于硬编码的规则来选择是根据成本而不是基于硬编码的规则来选择执行计划执行计划.n可以是可以是1,10,100,10

    46、00或者直接用或者直接用first_rows(n)hint指定任意指定任意正数正数.这里的这里的n是我们想获取结果集的前是我们想获取结果集的前n条记录条记录,这种需求在很多分页语这种需求在很多分页语句的需求中会碰到句的需求中会碰到.60.Autotrace 解读解读Current mode:对于修改的数据从数据段中读对于修改的数据从数据段中读Read-consistent mode:读一致性模式读一致性模式Physical block:物理块(如物理块(如8192字节)字节)Recursive calls:嵌套调用次数嵌套调用次数61.在在SQLPLUS 配置配置AUTOTRACEAUTOTR

    47、ACE 参数参数解解 释释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类似类似,所有的统计所有的统计

    48、和数和数据都在,但不可以打印据都在,但不可以打印62.在在SQLPLUS 配置配置AUTOTRACE1、首先创建首先创建PLUSTRACE角色并且赋给角色并且赋给public:Sql$ORACLE_HOME/sqlplus/admin/plustrce.sql2、赋权限给用户赋权限给用户Sql grant plustrace to public(预赋权的用户名)(预赋权的用户名);3、以、以SYSTEM用户创建用户创建PLAN_TABLE表表 Sql$ORACLE_HOME/rdbms/admin/utlxplan.sqlSql create public synonym plan_table

    49、 for plan_table;Sql grant all on plan_table to public;在每个用户下设置在每个用户下设置AUTOTRACE可显示其执行计划。可显示其执行计划。63.SQL select ename,dname from emp,dept where emp.deptno=dept.deptno and dept.dname in(ACCOUNTING,RESEARCH,SALES,OPERATIONS);Execution Plan-0 SELECT STATEMENT Optimizer=CHOOSE 1 0 NESTED LOOPS 2 1 TABLE

    50、ACCESS(FULL)OF EMP 3 1 TABLE ACCESS(BY INDEX ROWID)OF DEPT 4 3 INDEX(UNIQUE SCAN)OF PK_DEPT(UNIQUE)最起码要解决全表扫描问题最起码要解决全表扫描问题改变改变where条件的次序一般没有用条件的次序一般没有用优化器与执行计划优化器与执行计划64.SQL 调整的目标调整的目标n去掉不必要的大型表的全表扫描。去掉不必要的大型表的全表扫描。n缓存小型表的全表扫描。缓存小型表的全表扫描。n校验优化索引的使用。校验优化索引的使用。n检验优化的连接技术。检验优化的连接技术。以上目标任务将占据以上目标任务将占据S

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:ORACLE培训SQL性能优化课件.ppt
    链接地址:https://www.163wenku.com/p-4821497.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库