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

Oracle 物联网中的并行性

askTom 2018-11-07
285

问题描述

我正在尝试在并行模式下使用相同的键来加入 (外部加入) 许多物联网; 并期望优化器使用合并联接以避免排序 (如文档中明确指出应该这样做); 但它没有。-我正在跟踪问题,发现使用默认并行度创建的IOT,IOT索引本身只是单个的,即没有并行性。-使用NO_PARALLEL提示很有趣,但它仍然避免合并联接。我得到了与12.2.0.1.0相同的结果-我的问题是:-

1.) 如何确保IOT主要索引处于并行模式?
2.) 当源被预先排序时,为什么CBO仍然避免合并联接?

谢谢,埃尔温

CREATE TABLE TEST1 (
  MyKey INTEGER,
  MyData VARCHAR2(20),
  CONSTRAINT X1 PRIMARY KEY (MyKey) 
) ORGANIZATION INDEX PARALLEL NOLOGGING;
/
CREATE TABLE TEST2 (
  MyKey INTEGER,
  MyData VARCHAR2(20),
  CONSTRAINT X2 PRIMARY KEY (MyKey) 
) ORGANIZATION INDEX PARALLEL NOLOGGING;
/
select INDEX_NAME, DEGREE, INSTANCES from USER_INDEXES where INDEX_NAME like 'X%';
/
select /*+ NO_PARALLEL USE_MERGE(t1 t2) */ *
  from TEST1 t1, TEST2 t2
 where t1.MyKey=t2.MyKey(+);
/

专家解答

我觉得你在向后解决这个问题。加入两个IOTs并不能保证合并加入。从索引中读取数据意味着数据库不必排序。

正如医生所说:

Because of sorts required by other operations, the optimizer finds it cheaper to use a sort merge.

If an index exists, then the database can avoid sorting the first data set. However, the database always sorts the second data set, regardless of indexes.


https://docs.oracle.com/en/database/oracle/oracle-database/18/tgsql/joins.html#GUID-3F935776-FE28-4350-9FA4-E6B47489156E

给定您的示例,数据库选择嵌套循环,因为它具有较低的成本:

CREATE TABLE TEST1 (
  MyKey INTEGER,
  MyData VARCHAR2(20),
  CONSTRAINT X1 PRIMARY KEY (MyKey) 
) ORGANIZATION INDEX PARALLEL NOLOGGING;

CREATE TABLE TEST2 (
  MyKey INTEGER,
  MyData VARCHAR2(20),
  CONSTRAINT X2 PRIMARY KEY (MyKey) 
) ORGANIZATION INDEX PARALLEL NOLOGGING;

set serveroutput off

select /*+ USE_MERGE(t1 t2) */ *
  from TEST1 t1, TEST2 t2
 where t1.MyKey=t2.MyKey(+);
 
select * 
from   table(dbms_xplan.display_cursor(null, null, 'BASIC +COST LAST'));

PLAN_TABLE_OUTPUT                                                    
EXPLAINED SQL STATEMENT:                                             
------------------------                                             
select /*+ USE_MERGE(t1 t2) */ *   from TEST1 t1, TEST2 t2  where    
t1.MyKey=t2.MyKey(+)                                                 
                                                                     
Plan hash value: 786864782                                           
                                                                     
----------------------------------------------------                 
| Id  | Operation              | Name | Cost (%CPU)|                 
----------------------------------------------------                 
|   0 | SELECT STATEMENT       |      |     5 (100)|                 
|   1 |  MERGE JOIN OUTER      |      |     5  (20)|                 
|   2 |   SORT JOIN            |      |     2   (0)|                 
|   3 |    INDEX FULL SCAN     | X1   |     2   (0)|                 
|   4 |   SORT JOIN            |      |     3  (34)|                 
|   5 |    INDEX FAST FULL SCAN| X2   |     2   (0)|                 
---------------------------------------------------- 

select /*+ NO_PARALLEL */ *
  from TEST1 t1, TEST2 t2
 where t1.MyKey=t2.MyKey(+);
 
select * 
from   table(dbms_xplan.display_cursor(null, null, 'BASIC +COST LAST'));

PLAN_TABLE_OUTPUT                                               
EXPLAINED SQL STATEMENT:                                        
------------------------                                        
select /*+ NO_PARALLEL */ *   from TEST1 t1, TEST2 t2  where    
t1.MyKey=t2.MyKey(+)                                            
                                                                
Plan hash value: 2370096979                                     
                                                                
---------------------------------------------------             
| Id  | Operation             | Name | Cost (%CPU)|             
---------------------------------------------------             
|   0 | SELECT STATEMENT      |      |     2 (100)|             
|   1 |  NESTED LOOPS OUTER   |      |     2   (0)|             
|   2 |   INDEX FAST FULL SCAN| X1   |     2   (0)|             
|   3 |   INDEX UNIQUE SCAN   | X2   |     0   (0)|             
--------------------------------------------------- 


所以真正的问题是:

你为什么need合并联接?您当前拥有的嵌套循环/哈希连接有什么问题?合并连接如何 “修复” 这个?

关于并行点: 如果要确保查询并行运行,请添加并行提示。如果启用了自动并行度 (自动DOP),则数据库将确定是否使用并行执行。

在以下位置阅读有关此的更多信息:

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

评论