Oracle 直接路径插入(Direct-Path Insert)

直接路径插入(Direct Path Insert)是Oracle一种数据加载提速技术,可以在使用insert语句或SQL*Loader工具大批量加载数据时使用。直接路径插入处理策略与普通insert语句完全不同,Oracle会通过牺牲空间,安全性,并发性能来换取加载速度。

一、Direct-path Insert简介

普通insert语句叫做"传统插入"(Conventional Insert),数据在插入过程中会先缓存在buffer cache中,写入磁盘时会检查并重用数据块中的可重用空间,记录redo日志,维护完整性约束等,这些维护操作都是性能开销,而"直接路径插入"会忽略这些维护操作,换取插入性能的提升。

在海量数据加载场景,特别是向新表大批量加载数据时(加载数据存在原始备份、新表没有可重用空间、并发访问很低)。我们的第一需求可能是加载速度。针对此类场景Oracle提供了一种性能更高的数据加载方式:“直接路径插入”(Direct-Path Insert)。

传统插入与直接路径插入主要有以下5点区别:

  • 传统插入会经过buffer cache缓存后再写数据文件,而直接路径插入会直接写数据文件,这也是Direct-Path Insert名称的由来。
  • 传统插入会重用数据块中的空闲空间,即新旧数据混在一起。而Direct-Path Insert会直接在高水位线(High-Water Mark, HWM)之上追加写数据,即只在新的数据块中写数据,旧数据块中即使有空间也不会重用(更多的空间消耗)
  • 传统插入会维护引用完整性约束,Direct-Path Insert不会维护完整性约束(必须删除或禁用引用完整性约束)
  • 传统插入必须生成redo日志,Direct-Path Insert可以选择关闭redo日志(无法进行Media Recovery)
  • 传统插入不会影响表上其他DML操作,而Direct-Path Insert会获取表级的X锁,因此表上的insert, delete, update都会被阻塞(无法并发)

二、Direct-Path Insert应用场景

Direct-Path Insert可以在下列场景中使用:

  • 使用insert into … values … 语句时通过hint指示Oracle使用Direct-Path Insert
  • 使用insert into … as select … 语句时通过hint指示Oracle使用Direct-Path Insert
  • 使用并行执行,Oracle会自动使用Direct-Path Insert
  • 使用SQL*Loader工具向加载数据时指定使用Direct-Path Insert

2.1 insert into … values … 语句使用Direct-Path Insert

少量的insert into … values …语句通常没必要使用直接路径插入。而在PL/SQL程序中,如果需要通过insert into … values … 语句插入大量数据,则可以选择直接路径插入来提升执行速度。通过在insert关键字后附加/*+ append_values */提示来指示Oracle使用直接路径插入。

示例:建立2张同样的表,分别用传统插入和直接路径插入向表中加载1000万的数据,并记录执行时间:

create table t1(id integer, name varchar2(32));
create table t2(id integer, name varchar2(32));
declare
  type idtype is table of t1.id%type index by pls_integer;
  type nametype is table of t1.name%type index by pls_integer;
  pids idtype;
  pnames nametype;
  iterations constant pls_integer := 10000000;
  moment1 integer;
  moment2 integer;
  moment3 integer;
begin
  for j in 1..iterations loop
    pids(j) := j;
    pnames(j) := 'No.' || to_char(j);
  end loop;

  moment1 := dbms_utility.get_time;

  forall x in 1..iterations
    insert into t1(id, name) values(pids(x), pnames(x));  
  commit;

  moment2 := dbms_utility.get_time;

  forall x in 1..iterations
    insert /*+ append_values */ into t2(id, name) values(pids(x), pnames(x)); 
  commit;

  moment3 := dbms_utility.get_time;
  
  dbms_output.put_line('Execution Time Compare (seconds):');
  dbms_output.put_line('----------------------------------');
  dbms_output.put_line('Conventional Insert: '|| to_char((moment2 - moment1)/100));
  dbms_output.put_line('Direct-Path Insert: '|| to_char((moment3 - moment2)/100));
end;
/

在这里插入图片描述

  • 表t1和t2的表结构相同,使用循环向其中插入1000万条数据
  • 第一个循环使用传统插入,耗时7.14秒,第二个循环使用直接路径插入,耗时3.52秒

2.2 insert into … select … 子查询直接路径插入

使用insert into … select … 通过子查询向表中加载数据时,在insert或select关键字后附加/*+ append */提示来使用直接路径插入。

示例:将表t2的数据使用Direct-Path Insert加载到t1中

insert /*+ append */ into t1 select * from t2;
commit; 
insert into t1 select /*+ append */ * from t2;
commit;

在这里插入图片描述
注意:使用直接路径插入的数据,在提交前是不能查询和更新的,必须显式commit之后才可以使用。上面的两个insert语句中间必须有一个commit,否则第二条insert会失败(ORA-12838)

2.3 并行模式下使用Direct-Path Insert

当开启并行模式后,insert语句会自动变为Direct-Path Insert,但也可以选择使用提示/*+ noappend parallel */来禁用Direct-Path Insert。

示例:使用并行模式,首先要在会话级别打开并行DML:

alter session enable parallel dml;

在这里插入图片描述
检查是否满足下面3个条件中的任意一个(满足任意条件即可使用Direct-Path Insert):

  • 表已经打开并行属性
  • insert的时候显式使用parallel提示
  • 将初始化参数parallel_degree_poicy设置为auto

修改表的并行属性和在insert语句中显式使用parallel提示:

alter table t1 parallel;
insert /*+ parallel(t1,4) */ into t1 select * from t2;

在这里插入图片描述
修改parallel_degree_policy参数需要较高的权限:

alter system set parallel_degree_policy=auto;

在这里插入图片描述

2.4 使用SQL*Loader工具时指定Direct-Path Insert

SQL* Loader是Oracle提供的一个数据加载工具,用于将数据从外部文件加载到数据库的表中。在加载数据时,可以采用Direct-Path Insert提升加载速度。由于SQL* Loader的功能非常强大,使用也稍复杂,下面仅使用SQL*Loader的Express模式(不需要控制文件,且有大量默认选项)演示直接路径插入。

SQL* Loader加载数据时,指定direct=true选项可以指示其使用Direct-Path Insert,这里准备了一个简单的数据文件t1.dat,只有3行数据。
在这里插入图片描述
采用SQL* Loader的express模式将数据加载进入表t1,加载时指定direct=ture:

sqlldr hr/hr table=t1 direct=true

在这里插入图片描述

  • SQL*Loader的express模式会自动在当前目录下搜索table_name.dat文件,所以这里不需要指定数据文件
  • 日志的Path used: Direct代表其采用了直接路径插入

三、Direct-Path Insert与重做日志

与传统插入强制生成重做日志不同,Direct-Path Insert可以选择关闭重做日志的生成,减少性能开销(但也意味着无法进行Media Recovery)。

如果关闭了重做日志,Oracle只会生成很少量的无效重做日志,万一数据库崩溃了,这些使用Direct-Path Insert插入的数据块会被标记为损坏(因为没有重做日志无法进行Media Recovery),因此建议使用nologging模式插入数据后进行一次备份。

通过修改表/索引/分区/LOB的logging模式,可以关闭和打开该对象上重做日志的生成:

alter table t1 nologging;
alter table t1 logging;

在这里插入图片描述
注意:如果DBA在数据库或表空间级别设置的了force logging,那么你在表级别是无法关闭重做日志的,即使使用nologging选项也会被忽略。

alter database force logging;
alter database no force logging;

在这里插入图片描述

alter tablespace users force logging; 
alter tablespace users no force logging;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/415729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防御保护:防火墙内容安全

一、IAE(Intelligent Awareness Engine)引擎 二、深度检测技术(DFI和DPI) 1.DPI – 深度包检测技术 DPI主要针对完整的数据包(数据包分片,分段需要重组),之后对数据包的内容进行识别。&#x…

2024年阿里云2核4G云服务器性能如何?价格便宜有点担心

阿里云2核4G服务器多少钱一年?2核4G服务器1个月费用多少?2核4G服务器30元3个月、85元一年,轻量应用服务器2核4G4M带宽165元一年,企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

第三节-docker-cs架构分析

一、组成 docker engine:docker-client、rest-api、dockerd containerd: 1、管理容器生命周期 2、拉取/推送镜像 3、存储管理 4、调用runc 5、管理网络 containerd-shim:相当于一个驱动,containerd通过containerd-shim驱使…

SpringCloudNacos配置管理及热更新

文章目录 统一配置管理在nacos中添加配置文件从微服务拉取配置配置热更新方式1方式2 配置优先级 之前对 Nacos注册中心入门 已经做了演示. 这篇文章对 Nacos 的服务分级存储模型做理论与实践. 本篇文章阐述 Nacos 做配置中心的理论和实践. 统一配置管理 当微服务部署的实例越…

Vue NextTick工作原理及使用场景

$nextTick的定义及理解: 定义:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操…

热点参数流控(Sentinel)

热点参数流控 热点流控 资源必须使用注解 SentinelResource 编写接口 以及 热点参数流控处理器 /*** 热点流控 必须使用注解 SentinelResource* param id* return*/ RequestMapping("/getById/{id}") SentinelResource(value "getById", blockHandler …

Media Encoder 2024 for Mac v24.2.1中文激活版

Adobe Media Encoder 2024 for Mac 是一款专业的视频和音频编码工具,专为 Mac 用户打造。它可以将原始素材转换为各种流行格式,以满足不同的播放和发布需求。借助其先进的编码技术和预设设置,用户可以轻松优化输出质量,同时保持文…

森林监测VR虚拟情景再现系统更便利

AI人工智能技术已经逐渐渗透到各个领域,为我们的生活带来了诸多便利。在虚拟仿真教学领域,AI技术的应用也日益丰富,为虚拟情景交互体验带来了前所未有的好处。 提高VR虚拟情景的逼真度 通过深度学习和计算机视觉等技术,AI/VR虚拟现…

[unity]lua热更新——个人复习笔记【侵删/有不足之处欢迎斧正】

一、AssetBundle AB包是特定于平台的资产压缩包,类似于压缩文件 相对于RESOURCES下的资源,AB包更加灵活轻量化,用于减小包体大小和热更新 可以在unity2019环境中直接下载Asset Bundle Browser 可以在其中设置关联 AB包生成的文件 AB包文件…

2024.02.28作业

模拟面试 1. 什么是回调函数 将函数作为另一函数的参数 实现:通过函数指针,如线程的创建函数 2. 结构体和共用体的区别 结构体的每个成员都会分配内存,大小为各个成员所占内存之和,内存对齐 共用体的内存以最大成员为主 3. 赋…

MATLAB练习题:投骰子经过100格的概率

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 有一个人从原点(第0格)开始扔一个六面…

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能,加速CFD仿真,从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™(UI),用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…

玩客云刷机(保姆级教程)ArmBian+Casaos

最近我发现自己买的玩客云会24小时写我的硬盘,后面了解了一下,玩客云有链克计划,会一直写你的盘,且关不掉,所以我就自己刷了个机,刷成了Armbian,下面就是我的教程 准备材料 一根usb公对公的线…

flink重温笔记(八):Flink 高级 API 开发——flink 四大基石之 Window(涉及Time)

Flink学习笔记 前言:今天是学习 flink 的第八天啦!学习了 flink 高级 API 开发中四大基石之一: window(窗口)知识点,这一部分只要是解决数据窗口计算问题,其中时间窗口涉及时间,计数…

046-WEB攻防-注入工具SQLMAPTamper编写指纹修改高权限操作目录架构

046-WEB攻防-注入工具&SQLMAP&Tamper编写&指纹修改&高权限操作&目录架构 #知识点: 1、SQLMAP-常规猜解&字典配置 2、SQLMAP-权限操作&文件命令 3、SQLMAP-Tamper&使用&开发 4、SQLMAP-调试指纹&风险等级 演示案例&#xf…

华为配置AP接入GPON网络配置示例

配置AP接入GPON网络配置示例 组网图形 图1 配置AP接入GPON网络示例 表1 版本信息 网元 设备选型 版本 OLT EA5800 V100R019C20 AC AC6805 V200R019C10 AP AirEngine 6760-X1 配套安装OptiXstar S800E GPON光模块 V200R019C10 Switch S6320-SI V200R019C10 ^^^ 组…

[python]随机选取的方式——random.choices()

关于随机选取的函数。 1. 列表随机选取 1.1. 随机等概率选取一个结果 首先我们来想象一下,现在有一个列表,要在其中随机选取一个数字,比如: a [1,2,3,4,5] 这里我们需要用到一种比较简单的随机选取方式,即random…

Vueuse:打造高效的 Vue.js 开发利器

Vueuse:打造高效的 Vue.js 开发利器 Vueuse 是一个功能强大的 Vue.js 生态系统工具库,它提供了一系列的可重用的 Vue 组件和函数,帮助开发者更轻松地构建复杂的应用程序。本文将介绍 Vueuse 的主要特点和用法,以及它在 Vue.js 开发…

VS Code(Visual Studio Code)本地(local)和远程(ssh)Docker Container 下的 Python 开发和调试

VS Code(Visual Studio Code)本地(local)和远程(ssh)Docker Container 下的 Python 开发和调试 1. 目的需求2. VS Code 简介3. 使用实践:一个简单的实例3.1 准备工作3.1.1 远程服务器3.1.2 本地…

揭示IP风险画像的作用与价值

在当今数字化时代,互联网的快速发展为企业和个人带来了巨大的机遇,同时也带来了各种安全风险和威胁。随着网络攻击手段的不断升级和演变,传统的安全防御手段已经无法满足对抗复杂多变的网络威胁的需求。IP风险画像作为一种新型的网络安全解决…