6、SELECT 子句中避免使用 ‘ * ’
当你想在 SELECT 子句中列出所有的 COLUMN 时,使用动态 SQL 列引用‘*’是一个方
便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE 在解析的过程中,会将
‘*’依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的
时间。
7、减少访问数据库的次数
当执行每条 SQL 语句时,ORACLE 在内部执行了许多工作:解析 SQL 语句,估算索引
的利用率,绑定变量,读数据块等等。由此可见,减少访问数据库的次数,就能实际上减少
ORACLE 的工作量。
例如:
以下有三种方法可以检索出雇员号等于 0342 或 0291 的职员。
方法 1:(最低效)
select emp_name, salary, grade from emp where emp_no = 342;
select emp_name, salary, grade from emp where emp_no = 291;
方法 2:(次低效)
declare
cursor c1(e_no number) is
select emp_name, salary, grade from emp where emp_no = e_no;
begin
open c1(342);
fetch c1
into .., .., ..;
open c1(291);
fetch c1
into .., .., ..;
close c1;
end;
方法 3:(高效)
select a.emp_name, a.salary, a.grade, b.emp_name, b.salary, b.grade
from emp a, emp b
where a.emp_no = 342
and b.emp_no = 291;
注意:在 SQL*Plus,SQL*Forms 和 Pro*C 中重新设置 ARRAYSIZE 参数,可以增加每次数
据库访问的检索数据量,建议值为 200。
8、使用 DECODE 函数来减少处理时间
使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表。
例如:
select count(*), sum(sal)
from emp
where dept_no = 0020
and ename like 'SMITH%';
select count(*), sum(sal)
from , emp
where dept_no = 0030
and ename like 'SMITH%';
你可以用 DECODE 函数高效地得到相同结果:
select count(decode(dept_no, 0020, 'X', null)) d0020_count,
count(decode(dept_no, 0030, 'X', null)) d0030_count,
sum(decode(dept_no, 0020, sal, null)) d0020_sal,
sum(decode(dept_no, 0030, sal, null)) d0030_sal
from emp
where ename like 'SMITH%';
类似的,DECODE 函数也可以运用于 GROUP BY 和 ORDER BY 子句中。