Oracle PL/SQL高级编程(第八弹:性能优化:SQL语句性能优化)

本文介绍了Oracle SQL语句性能优化的几个关键点:选择正确的连接查询表顺序以减少处理时间;调整WHERE条件顺序,优先处理连接条件;避免使用通配符查询,改为指定列名;善用DECODE函数减少全表扫描次数;使用WHERE而非HAVING在GROUP BY前过滤数据;使用UNION替代OR提高索引列查询效率;以及使用EXISTS替代IN以提升查询性能。
摘要由CSDN通过智能技术生成

连接查询的表顺序

默认情况下,当对多个表进行连接查询时,Oracle分析器会按照从右到左的顺序处理FROM子句中的表名。例如下面的语句:

SELECT a.empno, a.ename,c.deptno, c.dname, a.log_action
  FROM emp_log a, emp b, dept c;

在执行时,Oracle会先查询dept表,根据dept表查询的行作为数据源串行连接emp表继续执行,因此dept表又称为基础表或驱动表。由于连接的顺序对于查询的效率有非常大的影响,因此在处理多表连接时,必须选择记录条数较少的表作为基础表,Oracle会使用排序与合并的方式进行连接。比如先扫描dept表,然后对dept表进行排序,再扫描emp表,最后将所有检索出来的记录与第一个表中的记录进行合并。
如果有3个以上的表连接查询,就需要选择交叉表(Intersection Table)作为基础表。交叉表是指哪个被其他表所引用的表。由于emp_log表时dept表和emp表的交叉表,即包含dept的内容又包含emp的内容,因此上述查询可以将emp_log作为驱动表:

SELECT a.empno, a.ename,c.deptno, c.dname, a.log_action
  FROM emp b, dept c, emp_log a;

指定WHERE条件顺序

在查询表时,WHERE条件的顺序往往影响了执行的性能。默认情况下,Oracle采用自下而上的顺序解析WHERE子句,因此在处理多表查询时,表之间的连接必须写在其他的 WHERE条件之前,过滤数据记录的条件写在最后,以便过滤了数据之后再进行连接处理。
另外在索引的利用上,也需要注意,使用索引列作为条件比非索引列作为条件的性能要高很多。当然在面对复杂的查询时,也许需要在多个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值