分享

关系数据库SQL查询语句的优化

 zww_blog 2014-04-11
 

———《数据库原理与应用》课程教学研究
 

摘要:优化查询有助于提高SQL的检索速度,是一种提高应用系统性能的重要方式。对SQL查询的优化方案主要从优化原理、视图、WHERE 子句、存储过程等,并结合实例阐明和验证。对优化查询的掌握,可使学生在数据库应用程序设计方面的课程中更能得心应手。
关键字:优化查询;SQL查询;关系数据库
        数据库查询操作是数据库操作的核心操作,对数据的查询效率及处理速度已成为衡量数据库性能的一个重要指标。数据库查询技术也是学生对《数据库原理与应用》这门课程所必须掌握的知识和技能,数据库查询技术的精通也为以后课程的学习(如:C#.NET程序设计)中的数据库应用程序的设计打下良好的基础。为了优化数据库的性能,简单、有效的方法就是优化查询。
        1优化原理和实质数据查询处理的代价通常取决于对磁盘的访问,因为磁盘比内存的访问速度要慢。对于一个给定的查询,有许多可能的处理策略,复杂查询更是如此[1]。查询优化的实质是在结果正确的前提下,找出与已有表达式等价,但查询效率更高的表达式。
        2在教学中要注重的几种典型的优化方法
        2.1 建立视图
        视图可简化用户操作数据的方式,使用户能着重于所感兴趣的特定数据和所负责的特定任务。如果该视图数据规模小于定义的基本表,则基于视图的查询比原查询的速会快得多。例:要查询每门课程成绩最高的学生的学号SELECT 学号,课程号,成绩FROM 成绩表AWHERE 成绩=(SELECT MAX(成绩)FROM 成绩表BWHERE A..课程号=B.课程号)语句缺点:这属嵌套查询,子查询的结果集将作为外层查询的条件,查询效率不高。解决方案:可先建立视图,求得每门课程的最高分,再与成绩表中比较,获取与视图中最高分数据相等的记录,这就减少了内层连接的数据量,从而提高了检索速度。用SQL语句优化的步骤为:
        首先,创建视图GREATE VIEW V_max_cnoscore ASSELECT 课程号,Max(成绩) AS 最高分数FROM 成绩表GROUP BY 课程号其次,利用视图检索数据SELECT 学号,A.课程号,A.成绩FROM 成绩表A,        V_max_cnoscore BWHERE A.成绩=B.最高分数AND A.课程号=B.课程号
        2.2 查询条件Where 子句的优化
        2.2.1 合理设置WHERE 条件的先后顺序。多数数据库都是按从左到右的顺序处理条件,把能过滤更多数据的条件放在前面,过滤少的放后面,便可提高检索速度。例:SELECT * FROM studentWHERE ssex=’女’ -- 条件1过滤的数据较少AND sdept=’计算机系’ -- 条件2 过滤数据比条件1 多上面的SQL就不符合上述原则,可改为:SELECT * FROM studentWHERE sdept=’计算机系’AND ssex=’女’对同一表格进行多个选择运算,选择条件的排序对性能有较大影响,不仅影响索引的选取,而且关系到临时表的大小[2]。因此,要提高查询速度,可将较严格的条件写在前面,较弱的放在后面。
        2.2.2 避免使用“< >”或“NOT”操作符。

“< >”或“NOT”均属于排斥性操作符,不是包括性操作符,这会使系统在搜索数据时无法使用索引,只能直接搜索表中的数据,例:
        (1)SELECT 学号FROM 成绩表WHERE 成绩< >80
        (2)SELECT 学号FROM 成绩表WHERE NOT(成绩<>80)
        (3)SELECT 学号FROM 成绩表WHERE 成绩< 80 OR成绩>80比较以上三条语句,可知第3 条可使用索引查询,它的查询速度最快。
        2.2.3恰当运用“OR 扩展”技术。该技术是把在Where 子句中带有OR的查询转换成包含多个UNION ALL的查询。例:查询计算机系县年龄不大于20 岁的学生。
        常规的SQL语句:SELECT 学号,姓名FROM 学生表WHERE 系名=’计算机系’ OR 年龄<=20假定表中“系名”和“年龄”两个字段上创建了索引,以上的查询可能不会使查询优化器使用索引,从而查询效率降低,可改进为:SELECT 学号,姓名FROM 学生表WHERE 系名=' 计算机系'UNION ALL SELECT 学号,姓名FROM 学生表WHERE 年龄<=20
        2.2.4 合理减少LIKE条件的使用。在SQL查询中,LIKE 条件使用的神奇之处在于其与通配符匹配所提供的模糊查询功能。但在字符串的比较中,有时大量字符的逐个比较,也会大大降低查找效率。
例:图书按26 个英文字母分为26 类,查找所有属于'A’类图书的销售金额。SELECT 图书类号, SUM (数量*单价) FROM 销售WHERE 图书类号LIKE′A%′GROUP BY图书类号优化为精确查询:SELECT 图书类号,SUM(数量*单价) FROM销售WHERE 图书类号>=′A′AND 图书类号<′B′GROUP BY图书类号
        2.3 正确使用子查询“展平”技术子查询“展平”技术就是指将子查询转变为半连接,连接或者反连接,从而将查询优化。例:找出成绩大于等于90 分的学生的姓名。SELECT 姓名FROM 学生表WHERE 学号IN(SELECT 学号FROM 成绩表WHERE 成绩>=90)语句缺点:需要搜索学生表的每一行,来查找所有满足子查询条件的记录。
        解决方案:将学生表作为连接的内表,查询将作为通常的连接来执行。
        优化后的SQL语句:SELECT 姓名FROM (SELECT 学号FROM 成绩表WHERE 成绩>=90) A,学生表B WHERE A. 学号=B.学号
        2.4 善于使用存储过程
        存储过程是SQL 语句和可选控制流语句的预编译集合,一个名称存储并作为一个单元处理。善于使用存储过程,将使SQL变得更加灵活和高效。
        例:查询某个学生某门课程的考试成绩,列出学生的姓名、
        课程名及成绩CREATE PROC pro_student_degree@stu_name char(12),@course_name char(18) ASSELECT sname,cname,degreeFROM student A INNER JOIN sc B ON A.sno=B.snoINNER JOIN course C ON C.cno=B.cnoWHERE sname=@stu_name AND cname=@course_name以上是一个带有两个输入参数的简单存储过程,只需执行一个简单的SQL语句———“EXEC pro_student_degre'e 刘娜’,’数据库原理’”就可完成查询。
        编写性能优化的SQL 语句是提高数据库系统的重要因素,随着数据库管理系统中数据量的增大,如何提高查询速度与效率也是计算机软件开发的一个时代要求。实现优化查询的方法很多,在使用中,要根据具体情况权衡利弊,使数据库查询性能最优。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多