ORACLE SQL性能优化系列(11)

oracle视频教程11g入门运维DBA性能优化OCP培训SQL数据库在线课程 获得教程资料方式:点击这里进入http://t.cn/E9WkBpu链接渠道可获得全套视频资料的百度网盘链接和提取密码 mysql数据库视频教程全套自学sql基础教学oracle11g sql server新 oracle视频教程11g入门运维DBA性能优化OCP培训SQL数据库在线课程 新SQL教程数据库视频数据分析Sql Server|MySQL|Oracle视频教程 视频课程内容 教程 基础... 阅读详情
36. 用UNION替换OR (适用于索引列)

通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.

在下面的例子中, LOC_ID 和REGION上都建有索引.

高效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10

UNION

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE REGION = “MELBOURNE”


低效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10 OR REGION = “MELBOURNE”


如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.


注意:


WHERE KEY1 = 10 (返回最少记录)

OR KEY2 = 20 (返回最多记录)


ORACLE 内部将以上转换为

WHERE KEY1 = 10 AND

((NOT KEY1 = 10) AND KEY2 = 20)


译者按:


下面的测试数据仅供参考: (a = 1003 返回一条记录 , b = 1 返回1003条记录)

SQL> select * from unionvsor /*1st test*/

2 where a = 1003 or b = 1;

1003 rows selected.

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 CONCATENATION

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

3 2 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

5 4 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

Statistics

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

0 recursive calls

0 db block gets

144 consistent gets

0 physical reads

0 redo size

63749 bytes sent via SQL*Net to client

7751 bytes received via SQL*Net from client

68 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1003 rows processed

SQL> select * from unionvsor /*2nd test*/

2 where b = 1 or a = 1003 ;

1003 rows selected.

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 CONCATENATION

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

3 2 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

5 4 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics

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

0 recursive calls

0 db block gets

143 consistent gets

0 physical reads

0 redo size

63749 bytes sent via SQL*Net to client

7751 bytes received via SQL*Net from client

68 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1003 rows processed



SQL> select * from unionvsor /*3rd test*/

2 where a = 1003

3 union

4 select * from unionvsor

5 where b = 1;

1003 rows selected.

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (UNIQUE)

2 1 UNION-ALL

3 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

4 3 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

5 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

6 5 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics

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

0 recursive calls

0 db block gets

10 consistent gets

0 physical reads

0 redo size

63735 bytes sent via SQL*Net to client

7751 bytes received via SQL*Net from client

68 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

1003 rows processed

用UNION的效果可以从consistent gets和 SQL*NET的数据交换量的减少看出



37. 用IN来替换OR


下面的查询可以被更有效率的语句替换:


低效:


SELECT….

FROM LOCATION

WHERE LOC_ID = 10

OR LOC_ID = 20

OR LOC_ID = 30


高效

SELECT…

FROM LOCATION

WHERE LOC_IN IN (10,20,30);


译者按:

这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的. 



38. 避免在索引列上使用IS NULL和IS NOT NULL

避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.

举例:

如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果

所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000

条具有相同键值的记录,当然它们都是空!


因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.

举例:


低效: (索引失效)

SELECT …

FROM DEPARTMENT

WHERE DEPT_CODE IS NOT NULL;


高效: (索引有效)

SELECT …

FROM DEPARTMENT

WHERE DEPT_CODE >=0;
CONCATENATION 引发的性能问题 背景是在一台11gR2的机器上,开发反映一个批处理比以前慢了3倍。经过仔细查看该SQL的执行计划,发现由于SQL中使用了or,导致CBO走出了一个非常糟糕的CONCATENATION路径。 no_expand提示的说明是 The NO_EXPAND hint prevents the cost-based optimizer from considering OR-expansion f 阅读详情

相关推荐

Oracle 11g 性能优化SQL调优深入实践

本文还有配套的精品资源,点击获取 简介:本章视频教程深入分析了Oracle 11g数据库性能调优与SQL优化的核心概念,覆盖性能顾问使用、表连接优化、常规SQL语句优化、索引管理、重演策略以及查询优化器的应用。教程为数据库管理员和开发人员提供关键知识,帮助提升数据库性能并应对复杂查询和大数据挑战。 1. Oracle性能顾问使用 Oracle数据库作为企业级...

weixin_32673065的博客 1168

Oracle的级联查询(CONCATENATION)

CONCATENATION

xxfamly的博客 2657

Oracle 11gR2数据库性能优化全面指南

Oracle数据库中,内存主要被分为两大区域:SGA和PGA。SGA负责存储数据库实例的缓存信息,而PGA则用于存储单个数据库会话的内存结构。SGA是数据库实例中所有服务器进程和后台进程共享的内存区域,包括数据缓冲区、共享池、重做日志缓冲区等。PGA则是私有内存区域,与特定的服务器进程关联。理解内存架构是进行内存调优的第一步。例如,数据缓冲区的大小直接影响到数据库读写操作的效率;共享池的大小和优化可以提升SQL解析的效率;重做日志缓冲区的大小则关系到事务日志的处理能力。

weixin_32252929的博客 741

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

ORACLE SQL性能优化系列 (十一)  36. 用UNION替换OR (适用于索引列)通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.高效:

hzfu007的专栏 963

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

36.       用UNION替换OR (适用于索引列)通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.    在下面的例子中, LOC_ID 和REGION上都建有索引.高效:   SELECT LOC_ID

black_snail的专栏 1300

ORACLE 11g新特性中文版

Oracle 11g 新特性 摘自ITPUB的love_zz的帖子 http://www.itpub.net/712880.html Oracle 11g现在已经开始进行beta测试,预计在2007年底要正式推出。和她以前其他产品一样,新一代的oracle又将增加很多激动人心的新特性。下面介绍一些11g的新特性。 1. 数据库管理部分 · 数据库重演(Databas...

love android 246

oracle partition exchange 测试

核心信息:11g-12c 版本表分区统计信息会同步,表统计信息、索引统计信息不同步 以下为测试脚本: DROP table t_partition_range; DROP table t_beexchange; create table t_partition_range(id number,name varchar2(20)) partition by range(id)( partition pmax values less than(maxvalue)); insert into t_partiti

weixin_40455124的博客 439

Oracle SQL性能优化 SQL优化

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

吉克先生的博客 1万+

Oracle SQL语句性能优化

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

m0_37957699的博客 1051

oracle 11g sql开发指南 下载,oracle 11g sql开发指南

Oracle专家JasonPrice带您一起学习如何通过SQL语句和PL/SQL程序访问Oracle数据库。本书是OraclePress重磅推出的一本关于OracleDatabase11gSQL的专著,是掌握SQL的必读之作。本书深入浅出、全面细致地讲解了如何读取和修改数据库信息,如何使用SQLPlus和SQLDeveloper,如何使用数据库对象,如何编写PL/SQL程序等内容。随着对本书学习的...

weixin_39646628的博客 217

Oracle SQL性能优化

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

Ltw518的专栏 899

ORACLE SQL性能优化No2

oracle SQL性能优化我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享! (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必

elimago的专栏 1523

OracleSQL性能优化

ORACLE SQL性能优化注意事项: select distinct 列, ... from tab 1 jon tab2 on () where ... group by ... having ... order by ... union all select ... (1)oracle 处理时, join 处理表从右向左,通常最后的表为基表, 表过滤先按 on 过滤,再是 where条件, 取出以后group by 再进行having过滤; distinct, order ...

doasmaster的博客 827

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

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

AlexLiu_2019的博客 240

oracle SQL性能优化

oracle SQL性能优化 我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必...

iteye_6516的博客 133

Oracle SQL性能优化技巧大总结

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值