您的位置:首页 > 数据库

关系数据库的查询优化策略二

2008-06-03 21:01 363 查看
关系数据库的查询优化策略二(转)

3 书写高效的SQL语句

虽然特定的数据库服务器都会对输入的查询语句进行一定的优化操作,但是查询效率主要取决于DBA所书写的SQL语句的好坏。为确保编写的SQL语句有较好的性能,应考虑以下的优化方法:

⑴尽量减少使用负逻辑的操作符和函数,因为它们会导致全表扫描,而且容易出错。可以把含有NOT、<> 、!= 等负逻辑的条件表达式转化为意思相当的正逻辑。

⑵字段提取要多少,取多少,避免使用“select *”格式,因为在数据量较大的时候,影响查询性能的最大因素不在与数据的查找,而在于物理I/O的操作。

⑶避免使用LIKE、EXISTS、IN等标准表达式,他们会使字段上的索引无效,引起全表扫描。尽量减少表的联接操作,不可避免的时候要适当增加一些冗余条件,使参与联接的字段集尽量少。

⑷OR会使字段上的索引失效,引起全表扫描。下面的例子中,可以把or子句分开,在把结果做加法和算,也可以编写一个存储过程来避免索引的失效。

Select work-name, work-dept from work where work-id=’2’ or work-id=’3’;

⑸尽量减少使用联接字段而把所有的条件分列出来用and来进行连接,可以充分的利用在某些字段上已经存在的索引。select work-id from salary where work-salary||”|| work-dept=’$2000 teacher’ ;

如果把条件分开来写成下面的格式,系统的查询性能可以得到一定的提高。

select work-no from salary where work-salary=$2000 and work-dept=’ teacher ’;

⑹尽量避免使用相关的嵌套查询

3.1 Where字句的影响

Where子句说明查询的条件,直接决定查询的性能。因此在where子句的书写及应用中要多加注意。书写where 子句时尽量避免使用不兼容的数据类型,避免对where 子句中的条件参数使用其他的数学操作符,尽可能的把操作转化到式子的左边,这样可以有效的利用已有的索引技术。对于where字句中的多个选择条件,要选取结果集小的先执行。下面给出一些不规范书写。

select work-id from salary where work-salary>4000;

select work-id from salary where work-salary*2>$4000;

对于第一个查询来说,4000是整数,而工人的工资时money格式的,系统在查询的时候需要耗费时间来进行格式转化。对于第二个例子,任何在运算符左边的操作都会使SQL采用全表扫描,对表中的每个数据项做相应的操作来比较是否满足条件,如果这个字段有索引,则索引失效。因此上面两个例子最好可以写成下面的格式:

select work-no from salary where work-salary>$4000;

select work-no from salary where work-salary>$2000;

4 存储过程的使用

存储过程由SQL语句和SPL语言的语句组成,创建后转换为可执行代码,作为数据库的一个对象存储在数据库中,存储过程的代码驻留在服务器端,因而执行时不需要将应用程序代码向服务器端传送,可以大大减轻网络负载,加快系统响应时间。同时,由于存储过程已编译为可执行代码,不需要每次执行时进行分析和优化工作,从而减少了预处理所花费的时间,提高了系统的效率。

在工程中,我们可以把经常用到的查询动作编写成一个存储过程,并利用参数实现动态查询过程来响应客户的要求;可以实现在服务器端进行批量数据处理等操作;可以使用存储过程作为强制安全性工具;还可以利用系统为用户定义的管理级别存储过程实现数据的管理、配置和监控等。合理使用存储过程可以有效的提高系统效率。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: