|
显然三种方法一种比一种要好,因为后者为优化器提供了更多的选择机会。
2.连接条件
在进行查询连接时优化器将所有连接的方法全部列举出来,计算每一种连接的成本,选择成本最低的一种。如连接时用到的数据无法获得,一般系统会使用平均密度作为依据,估算可能的命中率。
3.‘或’运算条件
当查询语句中有IN这样的关键词时,优化器将转化其中的内容以OR并列条件。例如:
SELECT * FROM author WHERE au_lname in (‘Berry,‘Densham)
将转化为:
SELECT * FROM author WHERE au_lname = ‘Berry or au_lname = ‘Densham
数据库管理系统将对每一个OR从句进行查询,将所有的结果合并后去掉重复项作为最终结果。
优化技巧
基于对上述数据库优化器的了解,为确保对我们将要执行的查询语句得以进行准确的优化
,我们应注意以下几点:
1.避免使用不兼容的数据类型。
例如float和int、char和varchar、binary和varbinary 是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。 例如:
SELECT name FROM employee WHERE salary > 60000
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整 型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。
2.如果在一个存储过程或触发器中,有表达式的值在编译时无法得到,优化器就只能使用它的平均密度来估计命中的记录数。例如:
DECLARE @value money
SELECT name FROM employee WHERE salary = @value
这样的命令是可优化的。只是由于@value的值在执行前不知道,它只能使用其平均密度来 估计这条命令将要命中的记录数。
3.避免对搜索参数使用其它数学操作符,如要将
SELECT name FROM employee WHERE SUBSTRING(id, 1, 1) = B
SELECT name FROM emplyee WHERE salary * 12 > 30000
写成为:
SELECT name FROM employee WHERE id like ‘B%
SELECT name FROM emplyee WHERE salary > 3000
4.避免使用!=或<>等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表 中的数据。例如:
SELECT id FROM employeeWHERE id != B%
优化器将无法通过索引来确定将要命中的行数。
上面我们提到的是一些基本的提高查询速度的注意事项,但是在更多的情况下,程序员往往需要反复试验比较不同的语句以得到最佳方案。此外更为重要的是需要数据库管理员 在数据库的服务器一端调整数据库管理系统的参数,以得到更快的响应性能,这就超出了本文的讨论范围。
(出处:清风网络学院)
上一篇:PB动态报表格式自由定义的实现
下一篇:PowerBuilder应用开发系列讲座(30)
|