- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最常用的SQL语句的优化要点
SQL的优化 现在我们以Oracle数据库为例,来讲述标 准SQL语句中最常用的语句的优化。 第一部分--SELECT语句 基本概念-基础表 SELECT语句中,FROM子句中写在最后的表,称为基础表 (driving table) 解析器从基础表开始,按照从右到左的顺序处理FROM子句中的表名 1、选择最有效率的表名顺序 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表. 当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描基础表并对记录进行排序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.以此类推。 例如: 表 TAB1 ---16,800 条记录 表 TAB2 ---1 条记录 选择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 (SELECT COUNT(ID) FROM EMP WHERE MGR=E.EMPNO) AND SAL 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; 抛砖引玉,
文档评论(0)