使用Oracle并行化插入查询的问题

如何解决使用Oracle并行化插入查询的问题

在与

并行运行的查询中出现问题

“ CREATE TABLE ... AS SELECT”语句,

但它不能与之并行运行

“ INSERT INTO ... SELECT”查询。

我在程序中使用了以下语句

立即执行“更改会话启用/强制并行DML”

。它适用于"delete from "语句,但对带有/*+parallel(30)*/提示的插入不起作用。

这可能是什么问题,并行插入是否存在其他解决方案?预先感谢。

解决方法

您不能很好地解释您的数据模型,所以让我解释一下有关Oracle Parallel Execution的不同可能性。对于insert / select语句,有两个操作可能会并行运行,也可能不会并行运行。一个是选择,另一个是插入。

测试用例表

SQL> create table t ( id number,c1 varchar2(130) ) ;

Table created.

SQL> create table x as select object_id,object_name from dba_objects ;

Table created.

SQL> select count(*) from x ;

  COUNT(*)
----------
    172514

场景1

表没有并行定义,没有通知提示,也没有启用alter session parallel。插入和选择将以串行模式运行。

SQL> explain plan for
  2  insert into t select * from x ;

Explained.

SQL> select * from table(dbms_xplan.display) ;

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2941724873

---------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |   194K|    14M|   172   (1)| 00:00:01 |
|   1 |  LOAD TABLE CONVENTIONAL | T    |       |       |            |          |
|   2 |   TABLE ACCESS FULL      | X    |   194K|    14M|   172   (1)| 00:00:01 |
---------------------------------------------------------------------------------

场景2

在插入语句中使用了提示并行,表没有并行定义,并且没有启用alter session。查询将以插入和选择两种串行模式运行。

SQL> explain plan for insert /*+parallel(t,10)*/ into t select * from x ;

Explained.

SQL>  select * from table(dbms_xplan.display) ;

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------Plan hash value: 2941724873

---------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |   194K|    14M|   172   (1)| 00:00:01 |
|   1 |  LOAD TABLE CONVENTIONAL | T    |       |       |            |          |
|   2 |   TABLE ACCESS FULL      | X    |   194K|    14M|   172   (1)| 00:00:01 |
---------------------------------------------------------------------------------

场景3

提示同时用于选择和插入。任何表中都没有并行定义,也没有使用alter session。插入将以串行模式运行,但是选择将并行运行。 (请在说明计划的末尾查看注释)

SQL>  explain plan for insert /*+parallel(t,10)*/ into t select /*+parallel(x,10)*/ * from x ;

Explained.

SQL>  select * from table(dbms_xplan.display) ;

PLAN_TABLE_OUTPUT
----------------------------------------
Plan hash value: 3828196258

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

----------------------------
    | Id  | Operation                | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
    ------------------------------------------------------------------------------------------------------------------
    |   0 | INSERT STATEMENT         |          |   194K|    14M|   172   (1)| 00:00:01 |        |      |            |
    |   1 |  LOAD TABLE CONVENTIONAL | T        |       |       |            |          |        |      |            |
    |   2 |   PX COORDINATOR         |          |       |       |            |          |        |      |            |
    |   3 |    PX SEND QC (RANDOM)   | :TQ10000 |   194K|    14M|   172   (1)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
    |   4 |     PX BLOCK ITERATOR    |          |   194K|    14M|   172   (1)| 00:00:01 |  Q1,00 | PCWC |            |
    |   5 |      TABLE ACCESS FULL   | X        |   194K|    14M|   172   (1)| 00:00:01 |  Q1,00 | PCWP |            |
    ------------------------------------------------------------------------------------------
Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
   - Degree of Parallelism is 10 because of table property
   - PDML is disabled in current session

正如您在上面的解释计划中所见,由于提示,选择并行运行。原因是,默认情况下,为每个会话设置了enable parallel query,因此,如果在选择中使用并行提示,则选择将并行运行。

场景4

在插入和选择上都使用了提示,但是这次我们启用了并行dml。这些表没有并行定义。插入将与选择并行运行。检查说明计划的注释。

SQL>  alter session enable parallel dml ;

Session altered.

SQL> explain plan for insert /*+parallel(t,10)*/ * from x ;

Explained.

SQL> select * from table(dbms_xplan.display) ;

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2234885790

----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT                   |          |   194K|    14M|    19   (0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR                    |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)              | :TQ10000 |   194K|    14M|    19   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    LOAD AS SELECT (HYBRID TSM/HWMB)| T        |       |       |            |          |  Q1,00 | PCWP |            |
|   4 |     PX BLOCK ITERATOR              |          |   194K|    14M|    19   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   5 |      TABLE ACCESS FULL             | X        |   194K|    14M|    19   (0)| 00:00:01 |  Q1,00 | PCWP |            |

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
   - Degree of Parallelism is 10 because of table property
 

如果在启用并行dml时对插入操作使用了提示并行,则插入将作为直接路径语句而不是常规插入运行。请记住,直接路径操作是表锁定的,因此在这种情况下,表将被其他dml操作锁定,直到提交事务为止。

场景5

您还可以更改表的并行属性,则无需使用任何提示。仅启用并行dml。

SQL> alter table t parallel 8 ;

Table altered.

SQL> alter table x parallel 8 ;

Table altered.

SQL> alter session enable parallel dml ;

Session altered.

SQL> explain plan for insert  into t select * from x ;

Explained.

SQL> select * from table(dbms_xplan.display) ;

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------Plan hash value: 2234885790

----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT                   |          |   194K|    14M|    24   (0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR                    |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)              | :TQ10000 |   194K|    14M|    24   (0)| 00:00:01 |  Q1,00 | PCWP |            |
|   4 |     PX BLOCK ITERATOR              |          |   194K|    14M|    24   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   5 |      TABLE ACCESS FULL             | X        |   194K|    14M|    24   (0)| 00:00:01 |  Q1,00 | PCWP |            |

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
   - Degree of Parallelism is 8 because of table property

请记住一些限制:

  • 如果要在其中进行插入的表启用了触发器,则该操作将不会并行运行。
  • 如果希望插入并行运行,则必须始终启用并行DML。在这种情况下,请使用并行提示或更改表的程度。提示使用不当将不会引发任何错误,只是它们将无法工作。
  • 如果并行运行插入/选择,则在大多数情况下,并行运行两个操作非常重要,因此每个QC的使用者可以共同工作。如果仅并行运行选择,则选择的使用者最终将处于空闲状态,而单个威胁正在运行插入。
  • 此模式(启用并行dml)是必需的,因为并行DML和串行DML具有不同的锁定,事务和磁盘空间要求,并且默认情况下禁用会话的并行DML。禁用并行DML时,即使使用PARALLEL提示,也不会并行执行DML。

您可以在此处阅读有关并行dml限制的更多信息

Restrictions on Parallel DML

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-