Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

29

主题
1#
发表于 2013-1-10 09:31:05 | 查看: 3851| 回复: 6
帖子有说
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低。
我就实验了下
explain plan for (select * from Ar_Cash_Receipts_All cr where cr.org_id=103 or cr.org_id=104)
1         
2        -------------------------------------------------------------------------------
3        | Id  | Operation         | Name                 | Rows  | Bytes | Cost (%CPU)|
4        -------------------------------------------------------------------------------
5        |   0 | SELECT STATEMENT  |                      | 98191 |    20M|  1594   (3)|
6        |*  1 |  TABLE ACCESS FULL| AR_CASH_RECEIPTS_ALL | 98191 |    20M|  1594   (3)|
7        -------------------------------------------------------------------------------
8         
9        Predicate Information (identified by operation id):
10        ---------------------------------------------------
11         
12           1 - filter("CR"."ORG_ID"=103 OR "CR"."ORG_ID"=104)
13         
14        Note
15        -----
16           - 'PLAN_TABLE' is old version


explain plan for (select * from Ar_Cash_Receipts_All cr where cr.org_id=103
union select * from Ar_Cash_Receipts_All cr where cr.org_id=104)

1         
2        -----------------------------------------------------------------------------------------
3        | Id  | Operation           | Name                 | Rows  | Bytes |TempSpc| Cost (%CPU)|
4        -----------------------------------------------------------------------------------------
5        |   0 | SELECT STATEMENT    |                      | 98190 |    20M|       |  7777  (51)|
6        |   1 |  SORT UNIQUE        |                      | 98190 |    20M|    80M|  7777  (51)|
7        |   2 |   UNION-ALL         |                      |       |       |       |            |
8        |*  3 |    TABLE ACCESS FULL| AR_CASH_RECEIPTS_ALL | 49095 |    10M|       |  1590   (2)|
9        |*  4 |    TABLE ACCESS FULL| AR_CASH_RECEIPTS_ALL | 49095 |    10M|       |  1590   (2)|
10        -----------------------------------------------------------------------------------------
11         
12        Predicate Information (identified by operation id):
13        ---------------------------------------------------
14         
15           3 - filter("CR"."ORG_ID"=103)
16           4 - filter("CR"."ORG_ID"=104)
17         
18        Note
19        -----
20           - 'PLAN_TABLE' is old version
语句挺简单的,但是没看出来第二条比第一条强太多啊,有能帮忙解释下的么?感激不尽
注:只是实验所以是select * 的
2#
发表于 2013-1-10 09:54:38
"帖子有说
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. "

哪个帖子说的?

回复 只看该作者 道具 举报

3#
发表于 2013-1-10 09:57:05
Maclean Liu(刘相兵 发表于 2013-1-10 09:54
"帖子有说
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. "

http://patmusing.blog.163.com/blog/static/135834960201001410944806/第四小点(4)  用UNION替换OR (适用于索引列)

回复 只看该作者 道具 举报

4#
发表于 2013-1-10 10:09:08
本帖最后由 dla001 于 2013-1-10 10:10 编辑

你的例子有问题;
应该是两个不同的列。where c1= or c2=
当c1 ,c2选择性都不错,并且都可以用索引是,使用or 只会用一个索引。这时换成
where c1=  union all where c2=会好

回复 只看该作者 道具 举报

5#
发表于 2013-1-10 10:21:59
dla001 发表于 2013-1-10 10:09
你的例子有问题;
应该是两个不同的列。where c1= or c2=
当c1 ,c2选择性都不错,并且都可以用索引是,使用o ...

举个例子,那如果是像c1=1 or c1=2这样的是这样还是union

回复 只看该作者 道具 举报

6#
发表于 2013-1-10 10:31:58
至少要有一点基本的  文档鉴别能力! 你链接的这篇文章, google.com基本是不踩他的,因为google的傻瓜算法都能知道这篇 过时或不靠谱

你仔细看下他的截图: Windows+ 9i + RBO , 最重要的RBO

这篇文章的说法对于CBO不适用

回复 只看该作者 道具 举报

7#
发表于 2013-1-10 10:35:08
Maclean Liu(刘相兵 发表于 2013-1-10 10:31
至少要有一点基本的  文档鉴别能力! 你链接的这篇文章, google.com基本是不踩他的,因为google的傻瓜算法 ...

刘大说的是,后来群里兄弟们也说了这个好多是8i之前的

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-26 14:14 , Processed in 0.047543 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569