《SQL优化策略》PPT课件.ppt
《《SQL优化策略》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《SQL优化策略》PPT课件.ppt(32页珍藏版)》请在三一办公上搜索。
1、提纲,SQL优化脚本的几个注意点,SQL解析执行,SQL执行计划,共享sql语句Oracle将用户提交的SQL语句进行解析,然后将执行计划放在内存(系统全局区SGA)中,这样可以减少对相同sql语句的重复解析。判断过程:1、对文本串计算hashed值比较;2、语句所涉及的对象比较。Rowid的概念Rowid是访问表中的给定的行的最快的访问方法,通过ROWID可以直接定位到相应的数据块上,然后将其读到内存。(索引也是通过rowid快速访问数据)Recursive SQL概念为了执行用户发出的一个sql语句,Oracle必须执行一些额外的语句。比如当我们发送一个DDL请求时,oracle会隐含的执
2、行RecursiveSql来修改相关的数据字典信息Row Source(行源)相当于SQL操作的中间结果,比如上一操作返回的符合条件的行的集合(可以是表的全部行数据或者部分行数据)Driving Table(驱动表)即前面说的基础表,我们应该尽量使用在应用查询的限制条件后,返回较少行源的表作为驱动表。,SQL执行计划,Probed Table(被探查表)即被驱动的内层表,一般该表较大并且相应被驱动关联的列上应该有索引。访问路径(方法)(accesspath)优化器在形成执行计划时需要做的一个重要选择是如何从数据库查询出需要的数据。对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取
3、方法),通过它们可以定位和查询出需要的数据,优化器会选择最优路径。(数据库块是最小的IO单位,即使只读一行数据,也会将整块的数据读到内存中)1)全表扫描(FullTableScans,FTS)Oracle会顺序分配给表的每个数据块,直到最高水平线(HWM)。使用FTS的前提条件:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过总量的5%-10%,或你想使用并行查询功能时。2)通过ROWID的表存取(TableAccessbyROWID或rowidlookup)3)索引扫描(IndexScan或indexlookup)一次I/O只能读取一个数据块表之间的连接表之间的连接顺序对于查询的效
4、率有非常大的影响,一般以较小的rowsource来驱动较大的rowsource.嵌套循环(NestedLoops,NL)哈希连接(HashJoin,HJ),SQL优化原则,选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表)将被最先处理,在FROM子句中包含多个表的情况下,尽量选择记录条数最少的表作为基础表。WHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接应该写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件应该写在WHERE子句
5、的末尾。SELECT子句中避免使用*Oracle在解析的时候会通过查询数据字典,将*转换成所有的列,所以尽量只写我们所需要的字段列。多表连接时,尽量使用表的别名(Alias)当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。用EXISTS替代IN、用NOT EXISTS替代NOT IN使用Not in 或者 in时,子句 内部会先执行一个全表遍历,效率较低。使用exists会直接关联匹配并返回满足条件的记录。,删除表全部记录,delete删除指定条件的数据,删除的数据会记录在滚回段,可恢复,速
6、度慢;truncate删除整个表的数据,不可恢复,速度快(直接重置HWM),减少对表的查询,在含有子查询的SQL语句中,要特别注意减少对表的查询.例如:低效 SELECT TAB_NAME FROM TABLES WHERE TAB_NAME=(SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION=604)ANDDB_VER=(SELECT DB_VER FROM TAB_COLUMNS WHERE VERSION=604)高效 SELECT TAB_NAME FROM TABLES WHERE(TAB_NAME,DB_VER)=(SELECT TAB_
7、NAME,DB_VER)FROM TAB_COLUMNS WHERE VERSION=604),Update 多个Column 例子:,低效:UPDATE EMP SET EMP_CAT=(SELECT MAX(CATEGORY)FROM EMP_CATEGORIES),SAL_RANGE=(SELECT MAX(SAL_RANGE)FROM EMP_CATEGORIES)WHERE EMP_DEPT=0020;高效:UPDATE EMP SET(EMP_CAT,SAL_RANGE)=(SELECT MAX(CATEGORY),MAX(SAL_RANGE)FROM EMP_CATEGORIES
8、)WHERE EMP_DEPT=0020;,用索引提高效率,总是使用索引的第一个列 避免改变索引列的类型 Count(index column name)比Count(*)快,用IN来替换OR,下面的查询可以被更有效率的语句替换:低效:SELECT.FROM LOCATION WHERE LOC_ID=10 OR LOC_ID=20 OR LOC_ID=30 高效 SELECT FROM LOCATION WHERE LOC_IN IN(10,20,30);,用=替代,如果DEPTNO上有一个索引,高效:SELECT*FROM EMP WHERE DEPTNO=4 低效:SELECT*FROM
9、 EMP WHERE DEPTNO 3,使用绑定变量,在查询中,绑定变量是一个占位符。例如,为了检索员工123的记录,可以查询:select*from emp where empno=123;select*from emp where empno=:empno;如果在查询中使用 常量,那每次每个查询都是一个新查询,即在数据库中以前没有过的查询,每次查询必须经过分析,限定(名称解析),安全检查、优化等等,简单地说,执行的每条语句在每次执行时都奖必须经过编译。第二个查询使用了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用,在性能和可伸缩
10、方面。这两者的差异是巨大的.,用外联接提高Not in表连接的查询速度,低效:SELECT pay_no,project_name FROM a WHERE a.pay_no NOT IN(SELECT pay_ NO FROM b WHERE VALUE=120000);高效:SELECT pay_no,project_name FROM a,b WHERE a.pay_no=b.pay_no(+)AND b.pay_no IS NULL AND b.VALUE=12000;,索引,索引与相关的表在逻辑上、物理上都是相互独立的,因为索引有自己的存储空间.一个索引可以拥有表一列或多列的值及与这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL优化策略 SQL 优化 策略 PPT 课件

链接地址:https://www.31ppt.com/p-5577181.html