SQL 主要功能之一就是不需要确切地告诉数据库如何获得数据,只需要执行一个查询,
指定想要的信息,而数据库会找到最好的方法获得它。
有时候通过优化技巧,获得更快的查询速度,以提高执行性能。
1 使用where 过滤不需要的行数据
没有where子句,它会检索table的所有行。是很浪费时间的。
where 子句中避免使用函数,否则会增加执行时间。
2 使用表连接 而不是多个查询
3 执行连接时使用完全限定的列引用
如:bad :
select p.name ,pt.name,description,price
from products p, product_types pt
where 1=1
and p.product_type_id =pt.product_type_id
and p.product_id =1;
good:
select p.name ,pt.name,p.description,p.price
from products p, product_types pt
where 1=1
and p.product_type_id =pt.product_type_id
and p.product_id =1;
使用列限定,数据库不需要浪费时间去搜索所有表,从而减少了执行时间。
4 使用case表达式而不是多个查询
当需要对一个table的相同行执行许多运算时,要使用case表达式,而不要用多个查询。
5 添加索引
6 使用where 而不是having
7 使用Union all 而不是 Union
Union 要删除两个查询的重复的行,需要时间。
8 使用exist 而不是 in
9 使用exist而不是distinct
10 使用Grouping sets 而不是 cube
11 使用绑定变量
代码重用的思想。
12 能使用TABLE 就不使用view
13 多表查询时,书写table的顺序是:数据量大的table 放在最前面
WHERE 子查询的顺序也一样。
SELECT A.* ,B.*
FROM A,B(数据量小)
WHERE A.ID=B.LINE_ID
14 经常要在where子句中出现的列,最好加索引(增加索引,会在insert数据时浪费时间去维护索引)
15 查询语句的where子句中避免有时间的列
16 要考虑代码重用,批量执行的好处
如:
速度差:
for i in 1.. 100 loop
insert into b;
select *
from a ;
update b
where id =*;
end loop;
优化后:
for i in 1.. 100 loop
insert into b;
select *
from a ;
end loop;
update b
where id =*;
17 多次用函数取值的sql
不如用sql得到所有的值,在二次查询。