资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
SQL的优化,现在我们以Oracle数据库为例,来讲述标 准SQL语句中最常用的语句的优化。 第一部分SELECT语句,基本概念基础表,SELECT语句中,FROM子句中写在最后的表,称为基础表 (driving table),解析器从基础表开始,按照从右到左的顺序处理FROM子句中的表名,1、选择最有效率的表名顺序,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.,当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描基础表并对记录进行排序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.以此类推。,例如: 表 TAB1 16,800 条记录 表 TAB2 1 条记录,不经意间,速度提高了26倍。,选择TAB2作为基础表 (最好的方法) select count(a.nsrsbh) from tab1 a,tab2 b where a.id=b.id 执行时间0.96秒,选择TAB1作为基础表 (不佳的方法) select count(b.nsrsbh) from tab2 a,tab1 b where a.id=b.id 执行时间26.09秒,所以:,如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. 但如果存在比交叉表记录少的多的表A,建议把A表作为基础表,交叉表放在倒数第二位。,2、WHERE子句中的连接顺序,ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,所以:,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.,例如: (低效,执行时间156.3秒) SELECT FROM EMP E WHERE SAL 50000 AND JOB = MANAGER AND 25 (SELECT COUNT(id) FROM EMP WHERE MGR=E.EMPNO);,(高效,执行时间10.6秒) SELECT FROM EMP E WHERE 25 50000 AND JOB = MANAGER;,3、SELECT子句中避免使用 *,当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 * 是一个方便的方法.,不幸的是,这是一个非常低效的方法. 实际上,ORACLE在解析的过程中, 会将* 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.,4、减少访问数据库的次数,当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见:,减少访问数据库的次数 , 就能实际上减少ORACLE的工作量. 就能提高系统的性能。,例如,: 以下有三种方法可以检索出雇员号等于0342及0291的职员的姓名、薪水和级别。,(来点难度,要求并列显示即一条记录!),(?。先思考思考。),方法1 (最低效) SELECT EMP_NAME , SALARY , GRADE FROM EMP WHERE EMP_NO = 342; SELECT EMP_NAME , SALARY , GRADE FROM EMP WHERE EMP_NO = 291;,方法老土!,方法2 (次低效) DECLARE CURSOR C1 (E_NO NUMBER) IS SELECT EMP_NAME,SALARY,GRADE FROM EMP WHERE EMP_NO = E_NO; BEGIN OPEN C1(342); FETCH C1 INTO , ; OPEN C1(291); FETCH C1 INTO , ; CLOSE C1; END;,用游标,有点复杂!,方法3 (高效) SELECT A.EMP_NAME , A.SALARY , A.GRADE, B.EMP_NAME , B.SALARY , B.GRADE FROM EMP A,EMP B WHERE A.EMP_NO = 342 AND B.EMP_NO = 291;,抛砖引玉,先到这吧。,
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号