- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
最常用的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; 抛砖引玉,
您可能关注的文档
最近下载
- 质量管理体系基础知识培训完整版.pptx VIP
- 足球社团活动课教案(33页) .pdf VIP
- 2024年档案职称考试题库(含答案).pdf VIP
- 怪物之锤(coc跑团设定).pdf VIP
- 七年级英语上册(外研版2024)-【新教材解读】义务教育教材内容解读课件.ppt
- B∕T 3098.9-2020 紧固件机械性能 有效力矩型钢锁紧螺母(高清版).pdf VIP
- 光传输线路与设备维护课件74_光传输线路与设备维护学习情境六PPT课件.ppt VIP
- 尼康D850使用说明手册D850UM.pdf VIP
- [哲学/历史]四山摩崖石刻.doc VIP
- 小学语文部编版三年级下册《修改病句》专项练习(共63题,附参考答案).pdf VIP
文档评论(0)