oracle sql优化

摘要:数据库性能问题一直是决策者及技术人员共同关注的焦点,影响数据库性能的 一个重要因素就是SQL查询语句的低效率,而在SQL查询语句中多表联接查询的使用频率很是之高,最能体现查询复杂性,每每是SQL优化的重点与难点。为 了提升查询速度,提升数据库应用系统的执行效率,文章从分析关系数据库多表查询处理过程入手讨论查询优化技巧,指出多表查询优化的原则。经过几种优化策略 的研究,在时间和空间上提升了系统的性能,在必定程度上提升了查询效率。
关键词:SQL 优化 联接
        引言
        多表联接操做每每要耗费大量的CPU时间和内存,因此 多表联接查询在查询优化中起到了相当重要的做用,是数据库中最基本、最经常使用、最复杂的操做。在数据库的管理信息系统中,联接查询操做是全部数据库操做中所 占据比重最大的操做。当数据库系统积累到必定程度,若查询时采用单条顺序扫描,那么扫描一遍全部的记录可能就得花上几十分钟,甚至几小时,这样的系统就失 去了现实的使用价值。采起什么样的查询策略,使联接查询时间下降,就是本文须要研究的查询优化问题。
        1 优化原理
        联接查询操做的前提是笛卡儿积,即要将多表中全部的元 组拿来运算,再从中找出符合条件的,其自己就增长了运算的负担,因此咱们在作优化时尽可能避免联接查询。若是必需要使用联接查询时也要尽可能使用较少的联接 表,查询优化力图找出给定等价的表达式,但执行效率更高,一个查询每每会有许多实现方法,关键是如何找出一个与之等价的且操做时间又少的表达式。优化的核 心问题是尽量减小查询中各表的参与加工的数据量,从而达到优化时间和空间的目的。
        2 联接查询优化的原则
        2.1 尽可能使用单表操做
        给定三个关系模式:(如下实例均以此为例)
        s(sno,sname,sec,birthday,email)
        c(cno,cname,creadit,tname)
        sc(sno,cno,score)
        例:查询1001学生选修的课程成绩。
        分析:在此查询中涉及到sno和score两个字段,sno在s表中,score在sc表中,若要使用s和sc的联接,
SQL语句为:SELECT score FROM s,sc WHERE s.sno=sc.sno and sno=‘1001’
则此查询就是多表联接查询,这样势必要作笛卡儿积操做,因此会增长检索的时间。
        分析:在此查询中涉及到的sno和score两个字段能够在sc表中所有找到,按照尽可能使用单表操做原则,能够只用一个sc表。
        SQL语句改成:SELECT score FROM sc WHERE sno=‘1001’这样避免了联接时的笛卡儿积操做,大大提升检索速度。
        2.2 避免不了的联接操做要作到如下几个原则:
        2.2.1 联接表时联少不联多 在作多表联接查询时,联接的表的个数尽可能少,这样就能够减小查询中参与加工的数据量,从而达到优化时间和空间的目的。
        例:查询选修了“数据库应用”课程的学生的学号和成绩。

 


        分析:此查询中涉及到sno、cname和score三个字段,分别在s、c和sc中,若要使用s、c和sc的联接,
SQL语句为:SELECT sno,score FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘数据库应用’
        则此查询是多表联接查询,而且联接的三表中,两两都要作笛卡儿积操做,因此会增长检索的时间。
        分析:此查询中涉及到sno、cname和score三个字段,分别在c表和sc表中就能够所有找到,按照联接表时联少不联多的原则,能够只用c和sc表。
        SQL语句改成:SELECT sno,score FROM c,sc WHERE c.cno=sc.cno and cname=‘数据库应用’
        2.2.2 联接表时在联少不联多的基础上要能实现联接 在作多表联接查询时,使联接的表的个数尽可能少,可是不能一味的追求表的个数,若是表的使用不能达到咱们要查询的数据,或者不能实现联接,那也是不成功的。
        例3:查询选修了“数据库应用”课程的学生的姓名。
        分析:此查询中涉及到sname和cname两个字 段,分别在s表和c表中,若要使用s和c的联接,SQL语句为:SELECT sname,cname FROM s,c WHERE  cname=‘数据库应用’则此查询是多表联接查询,但两个表没有公共属性,因此实现不了联接,这样此操做就变成了单纯的笛卡儿积操做,在此联接中会查询 出不符合条件的记录,失去了查询的意义。
        分析:此查询中涉及到sname和cname两个字段,分别在s表和c表中,可是s表和c表没有公共属性,不能实现联接,因此必须借助sc表,因此此查询是s表、c表和sc表三表的联接。
        SQL语句改成:SELECT sname,cname FROM s,c,sc WHERE s.sno=sc.sno and c.cno=sc.cno and cname=‘数据库应用’
        2.3 先筛选后联接
        当查询多个数据表时,要先过滤后联接。
        例5:查询全部成绩大于70分的学生的信息。
        分析:要作s表和sc表两表联接,并筛选出符合条件的记录。
        SQL语句为:SELECT*FROM s,sc WHERE s.sno=sc.sno   and score>70
        此查询语句首先将两个数据表按照学号进行联接,而后再将符合条件的记录筛选。因为两个数据表进行联接时有些记录是之后要筛选掉的,且多个数据表联接是笛卡尔积运算,消耗的时间会随着记录个数的增长很快地增加。
        SQL语句改成:SELECT*FROM s,sc WHERE score>70 and s.sno=sc.sno
此联接查询语句克服了以上缺点,首先筛选出符合条件的记录,减小了进行联接的记录个数,而后再执行联接查询,大大提升了查询效率。
        3 结束语
        查询优化要抓住关键问题,对于数据库应用程序来讲,重 点在于如何提升SQL的执行效率。在数据库的开发和维护过程当中,多表联接查询的优化设计能够提升系统性能,对于数据量大的数据库系统尤其重要。以上介绍的 几种优化策略使多表联接查询在时间和空间上提升了系统的性能,在必定程度上提升了查询效率。 数据库

 

相关文章
相关标签/搜索