数据库 SQL 查询技术的优化策略

来源:互联网 发布:在淘宝购物的步骤 编辑:程序博客网 时间:2024/04/29 22:58
[摘要]在数据库系统中,数据查询是一项及其重要的操作。影响数据库系统性能的因素有很多,其中运用SQL语句的优劣对数据库系统的性能有直接的影响。优化的SQL语句能够提高数据库系统的性能,从而实现高效的查询,提高系统的可用性。

[关键词]SQL     查询   优化

一、引言
在数据库应用系统中,相对于数据库其它操作,查询操作是最为重要的一部分, 在系统开发过程中,若不注重SQL的查询策略,往往在刚开始应用时比较流畅,但随着数据库表中记录的日积月累数量越来越大,系统的响应速度越来越慢,甚至让人无法忍受 ,因此 ,查询优化也就有着非常重要的地位。科学合理地构造查询系统,是成功开发数据库应用系统非常重要的环节。据统计约有 90 %的性能问题是由于程序员或用户使用了不恰当的查询语句造成的,因此SQL语句的质量对整个系统效率有重大关系。
DBMS处理查询计划的过程是:做完查询语句的词法、语法检查之后,将语句提交给DBMS 的查询优化器,优化器做完代数优化和存取路径的优化之后。由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。虽然现在的数据库产品在查询优化方面已经做得越来越好,但由用户提交的SQL 语句是系统优化的基础,因此用户所写语句的优劣至关重要。
二、优化方法
一个好的查询表达式不是基于纯粹的理论假设及谓词想像出来的,而是在实际的项目开发过程中总结的经验,本文就通过几个常用的查询优化方法,结合举例来说明SQL查询语句优化技术。
(一)合理建立和使用索引
索引是数据库中重要的数据结构,是优化的基础,建立索引的根本目的是提高查询效率,索引的使用要恰到好处,其使用原则如下:
1.在经常进行连接的列上建立索引,而不经常连接的字段则由优化器自动生成索引;
2.在频繁进行排序或分组的字段上建立索引;
3.在条件表达式中经常在不同值较多的列上建立索引,在不同值少的列上不要建立索引,例如在人事信息表中的“党员”字段中,只有两个不同的逻辑值:.T.和.F.这两个值,所以就没有必要建立索引。
例如:两个表PEOPLE(编号,姓名,性别……)和WIFE(编号,姓名,性别….)
命令SELECT PEOPLE.编号,PEOPLE.姓名,WIFE.编号,WIFE.姓名 FROM PEOPLE,WIFE WHERE PEOPLE.编号=WIFE.编号
这两个表要进行链接,就要在这两个表上以“编号”为字段建立索引。
(二)避免使用不兼容的数据
最微妙的查询问题之一就是在 WHERE 子句中,对具有不同类型的字段的比较,例如 FLOAT 与 INT ,CHAR 与 VARCHAR , BINARY 与 VARBINARY 是不兼容的,因此要求 WHERE 子句中表达式的数据类型是兼容的, 数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。
例如,对于SQL 语句
SEL ECT 姓名 FROM PEOPLE WHERE 月收入 >1500 
由于 WHERE 子句中, 字段月收入是货币型字段, 而1500是整型数, 优化器无法对其进行优化, 并且 DBMS 要耗费一定的时间将整型数1500转化成货币型字段后, 才能进行优化, 才能与字段月收入比较。为此, 在编程时可将整型数1500先转化成货币型字段, 而不要等到运行时由系统来转化,即语句改为:
SEL ECT 姓名 FROM PEOPLE WHER 月收入 ≥$1500
(三)避免使用“<>”或“NOT”这样的操作符
“<>”是排斥性的操作符 ,而不是包括性的操作符 ,这会使系统无法使用索引 ,而只能直接搜索表中的数据 .
例如1:SELECT 姓名 FROM PEOPLE WHERE 月收入<>1500
2:SELECT姓名 FROM PEOPLE WHERE NOT(月收入=1500)
3: SELECT姓名 FROM PEOPLE WHERE 月收入>1500 OR 月收入<1500
从上面3个命令我们就可以看出第3个命令可以使用索引查询,它的查询速度是最快的。  
(四)避免对搜索参数使用其它操作符如数学、字符串函数等
例如:SELEC 姓名FROM  PEOPLE WHERE SUBSTR(姓名,1,2)=“李”
WHERE子句中对列的任何操作结果都是在 SQL语句运行时逐列计算得到的 ,因此它不得不进行表搜索 ,而没有使用该列上面的索引 . 因此将 SQL 语句重写成下面这样:
SELEC姓名 FROM PEOPLE WHERE 姓名LIKE   “李%”
这样就提高了查询的速度。
(五)避免使用IN语句
当查询语句中有 IN 关键词时 ,优化器采用 OR并列条件。例如:
SELECT 姓名 FROM PEOPLE WHERE 编号 IN (“1002”,”1004”)
数据库系统转化为:
SELECT 姓名 FROM PEOPLE WHERE 编号=“1002”OR 编号=“1004”
在命令中,当可以使用IN或者EXIST时, EXISTS远比 IN 的效率高。在操作中如果把所有的 IN 操作符子查询改写为使用EXISTS的子查询 ,这样效率更高。同理 ,使用 NOT  EXIST代替NOT  IN会使查询添加限制条件 ,由此减少全表扫描次数 ,从而加快查询的速度以达到提高数据库运行效率。
(六)避免对查找条件使用各种运算符
对查询条件使用各种运算符,数据库系统在执行时,首先计算运算表达式的值,这样就影响系统的运算速度,例如:
1)SELECT * FROM PEOPLE WHERE 月收入*12>24000
2) SELECT * FROM PEOPLE WHERE 月收入>2000
这两个命令的查询结果是一样的,但是第一条命令首先计算表达式的值,然后再参与查询,而第二条命令则是直接查询,查询效率明显比第一条命令高。
三、结束语
编写优劣SQL语句是提高影响数据库系统的重要因素,对于数据库系统,不是仅仅实现功能即可,还要追求起执行的效率,在本文中,说明了在查询中编写SQL语句应该注意的问题,在大多数的情况下,需要反复试验不同的SQL语句才能得到最佳的方案。