Oracle DB 中的并行提示

问题描述 投票:0回答:2

我想在我的选择查询中使用并行提示来提高性能。但是这个 select 语句在 from 子句中包含多个表。我们如何在 select 语句中使用并行提示。

INSERT INTO /*+APPEND */ ITEM
    (
    )
    
    SELECT a FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>
    
    UNION
    
    SELECT a FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>
oracle optimization append hint
2个回答
0
投票

假设你的

PARALLEL_MAX_SERVERS
值是80。那么你可以使用它:

INSERT INTO /*+APPEND */ ITEM
    (
    )
    
    SELECT /*+ PARALLEL(p, 8) PARALLEL(r, 16) */ a 
    FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>
    
    UNION
    
    SELECT /*+ PARALLEL(p, 8) PARALLEL(r, 16) */ a 
    FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>

注意:

8
16
之和不能超过
80
的最大值。 要检查最大值,您必须以 SYS 或 SYSDBA 身份登录并运行下一个命令:

SELECT name, value FROM v$parameter WHERE name IN ('parallel_max_servers', 'parallel_execution_enabled');

0
投票

在 11g 之前,您必须为每个需要并行处理的表提供提示。从 11g 开始,您可以省略表别名,并且单个并行提示适用于整个语句。 Oracle 将自行决定什么是并行化的,什么不是,通常它会倾向于并行化大部分内容。指定的度数将尽可能用于所有对象。很简单:

INSERT /*+ APPEND PARALLEL(16) */ INTO ITEM
    (
    )
    SELECT a 
    FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>
    UNION
    SELECT a 
    FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>

请记住,并行提示将应用于选择部分,而不是插入部分,因为这需要启用并行 dml(

ALTER SESSION ENABLE PARALLEL DML
或提示
enable_parallel_dml
)。因此,要并行化整个过程,包括插入的块加载步骤,您需要:

INSERT /*+ APPEND PARALLEL(16) enable_parallel_dml */ INTO ITEM
    (
    )
    SELECT a 
    FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>
    UNION
    SELECT a 
    FROM GTT_LINE p, GTT_LINE_XY r
    Where <condition>

最后,请注意我将您的提示移回了一个词,紧跟在关键字

INSERT
之后。 Oracle 仅查找紧跟在 SQL 块的初始关键字之后的提示。

关于选择 DOP(并行度,本例中为 16),您需要考虑几个因素:

 1. What is the parallel_max_servers
 2. Is parallel_degree_policy = manual or auto?
 3. If auto, what is parallel_degree_limit set to?
 4. Has the DBA overridden hints with optimizer_ignore_parallel_hints?
 5. How many CPU cores are on the host(s) the database is mounted on?
 6. How many others sessions might be using how many parallel slaves at the same time?
 7. Is there a DBRM (Resource Manager) rule defined that caps DOP for your consumer group?
 8. How big are the tables you are scanning or joining?

由于这一切的复杂性,最好简单地询问您的 DBA 对该系统有何建议。如果使用过多,可能会导致数据库出现问题。我建议从 4 开始,并且只在需要时增加,假设有足够的资源。数字 8 和 16 并不特殊,它们只是程序员之间的约定。

© www.soinside.com 2019 - 2024. All rights reserved.