欢迎来到天天文库
浏览记录
ID:37901529
大小:48.50 KB
页数:7页
时间:2019-06-02
《SQL语句查询性能优化》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、SQl语句查询性能优化【摘要】本文从DBMS的查询优化器对SQL查询语句进行性能优化的角度出发,结合数据库理论,从查询表达式及其多种查询条件组合对数据库查询性能优化进行分析,总结出多种提高数据库查询性能优化策略,介绍索引的合理建立和使用以及高质量SQL查询语句的书写原则,从而实现高效的查询,提高系统的可用性。【关键词】SQL查询语句,索引,性能优化1.引言在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,索引的运用与复杂视图的编写等体会不出SQL语句各种写法的性能优劣,但是应用系统实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解
2、决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。面对海量数据查询,分时段对大批量数据进行删除、更新和插入操作,抓住需要优化的主要方面,针对不同的情况从如何采用高效的SQL入手来进行。2.索引的正确使用在海量数据表中,基本每个表都有一个或多个的索引来保证高效的查询,索引的使用需要遵循以下使用原则:(1)当插入的数据为数据表中的记录数量10%以上时,首先需要删除该表的索引来提高数据的插
3、入效率,当数据全部插入后再建立索引。(2)避免在索引列上使用函数或计算,在WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。举例:低效:select*fromtablewheresalary*12>25000;高效:select*fromtablewheresalary>25000/12;低效:select*fromtable1wherename='zhangsan'andtID>10000高效:select*fromtable1wheretID>10000andname='zhangsan'如果tID是一个聚合索引,那么后一句仅仅从表的
4、10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID>10000来提出查询结果。(3)避免在索引列上使用NOT和”!=”或<>,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到NOT和”!=”时,就会停止使用索引转而执行全表扫描。(4)索引列上用>=替代>高效:select*fromtablewhereDeptno>=4低效:select*fromtablewhereDeptno>3两者的区别在于,前者table将直接跳到第一个Deptno等于4的记录而后者将首先定位
5、到Deptno=3的记录并且向前扫描到第一个Deptno大于3的记录。(5)函数的列启用索引方法,如果一定要对使用函数的列启用索引,Oracle9i以上版本新的功能:基于函数的索引(Function-BasedIndex)是一个较好的方案,但该类型索引的缺点是只能针对某个函数来建立和使用该函数。createindexEMP_IONEMP(upper(ename));/*建立基于函数的索引*/select*fromEMPwhereupper(ename)=‘BLACKSNAIL’;/*将使用索引*/3.SQL语句性能优化3.1WHERE子句中的连接顺序ORACLE采用
6、自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写在其它where条件之前,那些可以过滤掉最大数量记录的条件必须写在where子句的末尾。低效:Select*fromtablewhereSalary>50000andJob=‘MANAGER’and25<(Selectcount(*)fromtablewhereMgr=table.Empno);高效:Select*fromtablewhere25<(selectcount(*)fromtablewhereMgr=table.Empno)andSalary>50000andJob=‘MANAGER’;3
7、.2用EXISTS替代IN在许多基于基础表的查询中,为了满足一个条件往往需要对另一个表进行联接,例如在ETL过程写数据到模型时经常需要关联10个左右的维表,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程,在这种情况下,使用EXISTS而不用IN将提高查询的效率。3.3用NOTEXISTS替代NOTIN子查询中,NOTIN子句将执行一个内部的排序和合并
此文档下载收益归作者所有