ORACLE SQL性能优化系列(12)

oracle hash leading,oracle 使用leading, use_nl, rownum调优(引用) 成本计算方法:设小表100行,大表100000行。两表均有索引:如果小表在内,大表在外(驱动表)的话,则扫描次数为:100000+100000*2 (其中2表示IO次数,一次索引,一次数据)如果大表在内,小表在外(驱动表)的话,则扫描次数为:100+100*2.两表均无索引:如果小表在内,大表在外的话,则扫描次数为:100000+100*100000如果大表在内,小表在外的话,则扫描次数为:100... 阅读详情
39. 总是使用索引的第一个列

如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.


译者按:

这也是一条简单而重要的规则. 见以下实例.


SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));

Table created.

SQL> create index multindex on multiindexusage(inda,indb);

Index created.

SQL> set autotrace traceonly


SQL> select * from multiindexusage where inda = 1;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE'

2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE)


SQL> select * from multiindexusage where indb = 1;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'


很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引



40. ORACLE内部操作

当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作.

ORACLE Clause
内部操作

ORDER BY
SORT ORDER BY

UNION
UNION-ALL

MINUS
MINUS

INTERSECT
INTERSECT

DISTINCT,MINUS,INTERSECT,UNION
SORT UNIQUE

MIN,MAX,COUNT
SORT AGGREGATE

GROUP BY
SORT GROUP BY

ROWNUM
COUNT or COUNT STOPKEY

Queries involving Joins
SORT JOIN,MERGE JOIN,NESTED LOOPS

CONNECT BY
CONNECT BY




41. 用UNION-ALL 替换UNION ( 如果有可能的话)


当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序.

如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.


举例:

低效:

     SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'

UNION

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'

高效:

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'

UNION ALL

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'


译者按:

需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是

要从业务需求分析使用UNION ALL的可行性.

UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这

块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量


Select substr(name,1,25) "Sort Area Name",

substr(value,1,15) "Value"

from v$sysstat

where name like 'sort%'



42. 使用提示(Hints)

对于表的访问,可以使用两种Hints.

FULL 和 ROWID


FULL hint 告诉ORACLE使用全表扫描的方式访问指定表.

例如:

SELECT /*+ FULL(EMP) */ *

FROM EMP

WHERE EMPNO = 7893;


ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表.


通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引.

如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留

在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint 一起使用.

例如:

SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ *

FROM WORK;


索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称

例如:

SELECT /*+ INDEX(LODGING) */ LODGING

FROM LODGING

WHERE MANAGER = ‘BILL GATES';


在不使用hint的情况下, 以上的查询应该也会使用索引,然而,如果该索引的重复值过多而你的优化器是CBO, 优化器就可能忽略索引. 在这种情况下, 你可以用INDEX hint强制ORACLE使用该索引.


ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等.


译者按:

使用hint , 表示我们对ORACLE优化器缺省的执行路径不满意,需要手工修改.

这是一个很有技巧性的工作. 我建议只针对特定的,少数的SQL进行hint的优化.

对ORACLE的优化器还是要有信心(特别是CBO)
Oracle中Hint深入理解 Hint概述基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。 此时就需要DBA进行人为的干预,告诉优化器使用我们指定的存取路径或连接类型生成执行计划,从 而使语句高效的运行。例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫... 阅读详情

相关推荐

Oracle hint Leading 的使用

Leading(): 指示Oracle在执行join(hash join, nested loop join, merge join)时的连接顺序。当执行计划不按照最优的表连接顺序时,考虑使用Leading 改变执行计划。eg:select v.*, t.* from v_view1 ,(select  /*+ leading(t1, tftc) */ * from tftc, t1 where ...

有梦就别怕痛 1万+

ORACLE SQL性能优化系列 (十二)

39. 总是使用索引的第一个列 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 译者按: 这也是一条简单而重要的规则. 见以下实例. SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10)); Table c

Xiaoke的专栏 751

Hint 使用--leading

Oracle hint -- leading 的作用是提示优化器某张表先访问,可以指定一张或多张表,当指定多张表时,表示按指定的顺序访问这几张表。而 Postgresql leading hint的功能与oracle不同,leading 后面必须跟两张或多张表,如果是两张,表示这两张表先进行连接,但两张表的访问顺序不定。如果要严格控制表的访问顺序,还必须使用双括号,具体用法以例子形式进行介绍。 ...

lyu1026的博客 2142

Oracle SQL性能优化 SQL优化

(1) 选择最有效率的表名顺序(只在基于规则的优化(Oracle有两种优化器:RBO基于规则的优化器和CBO基于成本的优化)中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就

吉克先生的博客 1万+

ORACLE SQL性能优化系列

ORACLE SQL性能优化系列 () 关键字 ORACEL SQL Performance tuning       1. 选用适合的ORACLE优化器       ORACLE优化器共有3种:   a. RULE (基于规则) b. COST

志在千里 3529

Oracle SQL性能优化

oracle 性能优化

weixin_36837739的博客 4444

oracle 使用别名过慢,ORACLE SQL性能优化系列

ORACLE SQL性能优化系列 () black_snail(翻译)关键字 ORACEL SQL Performance tuning出处 http://www.dbasupport.com1. 选用适合的ORACLE优化ORACLE优化器共有3种:a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性)设置缺省的优化器,可以...

weixin_28684449的博客 782

ORACLE SQL性能优化系列()

12.       尽量多使用COMMIT 只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: COMMIT所释放的资源:a.       回滚段上用于恢复数据的信息.b.       被程序语句获得的锁c.       redo log buffer 中的空间d.       ORACLE为管理上述3种资源中的内部花费 (译者按:

baggio785的专栏 1861

ORACLE SQL性能优化系列 ()

 1. 选用适合的ORACLE优化器    ORACLE优化器共有3种:   a.  RULE (基于规则)   b. COST (基于成本)  c. CHOOSE (选择性)    设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL

black_snail的专栏 2727

Oracle SQL 性能优化技巧

<br />Oracle SQL 性能优化技巧 <br /> <br /> .选用适合的ORACLE优化器 <br />ORACLE优化器共有3种 <br />A、RULE (基于规则) b、COST (基于成本) c、CHOOSE (选择性) <br />    设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。 你当然也在SQL句级或是会话(session)级对其进行覆盖。 <br

小包的技术专栏 1020

oracle性能优化:ORACLE SQL性能优化系列 ()[转]

oracle性能优化:ORACLE SQL性能优化系列 ()[转]

AlexLiu_2019的博客 296

Oracle SQL语句性能优化

(1)      选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表

m0_37957699的博客 1051

oracle脚本调优,Oracle SQL性能优化系列学习一

正在看的ORACLE教程是:Oracle SQL性能优化系列学习一。1.选用适合的ORACLE优化ORACLE优化器共有3种:a.RULE(基于规则)b.COST(基于成本)c.CHOOSE(选择性)设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS.你当...

weixin_39581845的博客 186

oracle sql 不等 优化6,ORACLE SQL性能优化系列 ()

ORACLE SQL性能优化系列 ()ORACLE SQL性能优化系列 ()作者: black_snail关键字 ORACLE PERFORMANCE TUNING SQL出处20. 用表连接替换EXISTS通常来说 , 采用表连接的方式比EXISTS更有效率SELECT ENAMEFROM EMP EWHERE EXISTS (SELECT ‘X'FROM DEPTWHERE DEPT_NO...

weixin_36163672的博客 147

oracle性能优化:ORACLE SQL性能优化系列 ()[转]

oracle性能优化:ORACLE SQL性能优化系列 ()[转]

AlexLiu_2019的博客 243
上一篇: ORACLE SQL性能优化系列(11)
下一篇: ORACLE SQL性能优化系列(13)
netspecial
博客等级 码龄25年 4粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值