问题描述
我正在尝试在并行模式下使用相同的键来加入 (外部加入) 许多物联网; 并期望优化器使用合并联接以避免排序 (如文档中明确指出应该这样做); 但它没有。-我正在跟踪问题,发现使用默认并行度创建的IOT,IOT索引本身只是单个的,即没有并行性。-使用NO_PARALLEL提示很有趣,但它仍然避免合并联接。我得到了与12.2.0.1.0相同的结果-我的问题是:-
1.) 如何确保IOT主要索引处于并行模式?
2.) 当源被预先排序时,为什么CBO仍然避免合并联接?
谢谢,埃尔温
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
给定您的示例,数据库选择嵌套循环,因为它具有较低的成本:
所以真正的问题是:
你为什么need合并联接?您当前拥有的嵌套循环/哈希连接有什么问题?合并连接如何 “修复” 这个?
关于并行点: 如果要确保查询并行运行,请添加并行提示。如果启用了自动并行度 (自动DOP),则数据库将确定是否使用并行执行。
在以下位置阅读有关此的更多信息:
https://blogs.oracle.com/datawarehousing/what-is-auto-dop
正如医生所说:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




