暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle语句优化(三)

原创 水煮鱼 2022-08-12
309

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 子句中。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

暂无图片
获得了2512次点赞
暂无图片
内容获得870次评论
暂无图片
获得了3377次收藏