oracle 删除主键_大数据量删除的思考 4

b104099f14869fe88609a884de4282f2.png

译者  汤健 · 沃趣科技数据库技术专家

出品  沃趣科技

c2ebd5e0df45ef286e12828ad9cb3568.png

575d98c78cda1fd61fc5b7fc6926e9e8.gif在本系列的前一期文章中,我制作了一些图,突出显示了按表扫描执行大量删除操作和按索引范围扫描执行大量删除之间的主要区别。根据所涉及的数据模式,选择正确的策略可能对随机I/Os的数量、生成的undo的数量和排序所需的CPU数量产生显著影响——所有这些都可能影响执行删除所需的时间。然而,这个简单的演示跟生产环境当中相比,生产环境当中这个情况更为复杂。所以,如果你面临着一项艰巨的任务,你需要仔细考虑如何对真正代表你要处理的系统的东西进行建模。实际上有两种不同的情况,这一点很重要。*当你在处理一个非常大的一次性任务时,你需要在第一时间就把它做好,一些关键性的特殊情况不要发现的太迟——尤其是如果你不允许把生产系统离线来完成这个任务任务,而且你的工作期限很紧的话。*当你有一份常规的、但不经常发生的、非常大的工作时,有必要了解一下哪些看起来不相关的小操作可能对运行时产生很大影响;而且,了解下一次升级可能会出现什么问题是值得的,这样您就可以预先解决任何问题。当然,后者的一个简单例子是我对12c的简短评论,以及它通过索引快速全扫描来驱动删除的能力-这一功能在早期版本的Oracle中无法运行。在我的小示例中,一个测试将其执行计划从11g的索引全扫描更改为12c的索引快速全扫描,完成所需的时间是原来的两倍。继续想一想——当你试图通过索引范围扫描来删除Oracle中的表或者索引时,您能想到多少事情,这可能会产生怎样的影响?对于一个繁忙的系统,这个建议听起来不错。有时候,你会发现一个长时间运行的DML语句在运行时速度非常慢,因为事实上它涉及到数据中最近的部分,因此会受到当前变化的影响;从这一点来看,Oracle发现它必须读取undo段来获取undo数据,这使得创建与读取一致的数据块版本成为可能-它需要这样做,以便它可以检查当前和读取一致的版本的块同意哪些行应该删除。我做的一个例子是通过“date_open”索引删除数据-因此,如何强制索引进行降序范围扫描,以便首先检查最新的数据在它有很多(或任何)时间遭受其他DML的附带损害之前?有一个非常快捷的方法可以检验这个想法的有效性。所以我们要做的就是检查排序的行数和删除的行数我们就能知道优化是否发生了。我的测试数据集有1000000行和4个索引(主键client_ref、date_open和date_closed索引),所以在最好的情况下,我应该看到:“sort (rows)”= 4 *行被删除。下面是我做的一个测试的总结,我想知道会发生什么:
delete /*+ index_desc(t1 t1_pk) */ from t1 where id <= 5e6


5000000 rows deleted.

Name                                 Value                       

----                                 -----
sorts (rows)                            29

我们删除了500万行并(有效地)没有排序。当我们按降序遍历索引时,优化根本不适用—我确实检查了执行计划是否显示了我所指定的“索引范围递减扫描”。

create index t1_dt_open on t1(date_open desc) nologging tablespace test_8k_assm_2;
delete /*+ index(t1 t1_dt_open) */ from t1 where date_open <= add_months(sysdate, -60);

4999999 rows deleted.

Name                                 Value
----                                 -----
sorts (rows)                    20,003,449

在副作用很小的范围内,“sort (rows)”= 4 *已删除的行:所以可以使用降序索引先尝试删除较新的数据——这很好,作为一个通用特性来记住可能很有用。

让我们想象一下其他可能出错的情况。*我在这个表上定义了一个主键——但是你可以使约束延迟,或者您可以简单地创建一个非惟一索引来保护惟一(或主键)约束。如果我们试图通过主键索引删除,会产生什么影响?*如果我们要考虑约束,我们可能要考虑外键约束的影响——我们有一个client_ref列,在生产系统中,它可能是对clients表的外键引用。让我们创建这个表并添加外键约束。*当我们使事情变得更困难时——有一个众所周知的特性将数组处理转换为“逐行”处理——触发器。如果我们向表中添加行级触发器,会产生什么效果?什么类型的触发器(在之前/之后、插入/更新/删除)有什么区别吗?以下是一些结果-首先,主键约束的非唯一索引:
alter table t1 drop primary key;

alter table t1 add constraint t1_pk primary key(id)
deferrable initially immediate
using index nologging tablespace test_8k_assm_2
;

delete /*+ index(t1 t1_pk) */ from t1 where id <= 5e6;

5000000 rows deleted.

Name                                 Value
----                                 -----
sorts (rows)                     15,000,004

在这个例子中,Oracle将我的主键索引设置为非惟一,作为约束可延迟的副作用,但是即使约束不可延迟,并且您只是将索引创建为非惟一,其效果也是一样的。统计数据告诉我们,我们已经将优化应用于四个索引中的三个——快速检查一下v$segment_statistics,就会发现它是主键索引,没有进行特殊处理,它受到了超过500万个“db块更改”的影响。在这一点上,有必要快速检查一下,看看通过其他索引驱动是否会改变这种情况——但是不会,这是惟一约束与非惟一索引结合的副作用。

其次,当大表是“子表”时,引用完整性的影响:
create table t2 (
        client_id,
        client_name
) as
select
        distinct
                client_ref,
                rpad('x',100,'x')
from
        t1
;
alter table t2 add constraint t2_pk primary key(client_id);
alter table t1 modify client_ref not null;
alter table t1 add constraint t1_fk_t2 foreign key (client_ref) references t2(client_id);

5000000 rows deleted.

Name                                 Value
----                                 -----
sorts (rows)                    15,002,849

我们已经排序了大约1500万行,而通常我们需要排序2000万行.同样,我们可以检查v$segment_statistics来找出哪个索引遭受了500万的损失“db block changes”你可能不会对“外键”索引被逐行维护而感到惊讶-我们可能会猜测,这是某种先发制人的代码使得Oracle必须处理“外键锁定”威胁。

我们通过主键删除这个特定测试的后续操作是,考虑如果我们通过外键索引本身删除,或者甚至将约束修改为“on delete cascade”并删除一些父行,将会发生什么。通过client_ref在t1上驱动delete仍然优化了其他三个索引,但是当您试图利用“on delete cascade”机制时,这个技巧根本没有机会产生大规模的效果。在幕后你会发现这样的事情:
delete from "TEST_USER"."T1"
where
 "CLIENT_REF" = :1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        3      0.00       0.00          0          0          0           0
Execute   3000      5.23      15.37      69349       9238     428052       32510
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     3003      5.23      15.37      69349       9238     428052       32510


Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
     0          0          0  DELETE  T1 (cr=3 pr=22 pw=0 time=9672 us)
     7          8         11   INDEX RANGE SCAN T1_CLIENT (cr=3 pr=0 pw=0 time=125 us cost=3 size=594 card=22)(object id 150589)

This output the consequence of a bulk delete of 3,000 rows from t2 – because of the “on delete cascade”, the delete operated row by row on t2 and for each row Oracle executed a delete statement against t1.

这个输出是t2批量删除3000行的结果——由于“on delete cascade”,delete在t2上逐行操作,对于每一行Oracle都对t1执行一条delete语句。

从技术上讲,基于数组的优化是有效的,由于索引范围扫描,它给我们带来了一点好处,但是数据的分散性是如此之大,以至于每次调用几乎没有给我们带来任何好处。在某个阶段,我们将不得不进一步探索这种父/子的关系。最后是触发器。众所周知,行级触发器可以将数组处理转换为单行处理——Oracle的索引维护优化也会发生同样的事情吗?
create or replace trigger t1_brd
before delete on t1
for each row
begin
    null;
end;
/


delete /*+ index(t1 t1_pk) */ from t1 where id <= 5e6;

5000000 rows deleted.

Name                                 Value
----                                 -----
sorts (rows)                         2,639

优化完全消失了。同样的事情也会发生在“为每一行删除后”触发器上,但是如果触发器是insert或update(行级)触发器,则不会发生这种情况。值得一提的是,索引优化也发生在索引列的值发生变化的更新上(请参阅本文),因此留给感兴趣的读者一个练习,看看哪些(如果有的话)触发器类型允许优化在数组更新后继续存在。

| 译者简介

汤健·沃趣科技数据库技术专家

沃趣科技数据库工程师,多年Oracle数据库从业经验,深入理解Oracle数据库结构体系,现主要参与公司一体机产品安装、测试、优化,并负责电信行业数据库以及系统运维。

相关链接

MySQL 一个让你怀疑人生的hang死现象

MySQL 执行DDL语句 hang住了怎么办?

MySQL行级别并行复制能并行应用多少个binlog group?

binlog server还是不可靠吗?

MySQL binlog基于时间点恢复数据失败是什么鬼?

开源监控系统Prometheus的前世今生

prometheus监控多个MySQL实例

MySQL问题两则

Kubernetes scheduler学习笔记

大数据量删除的思考(三)

大数据量删除的思考(二)

大数据量删除的思考(一)

统计信息记录表|全方位认识 mysql 系统库

数据库对象信息记录表|全方位认识 mysql 系统库

访问权限控制系统|全方位认识 mysql 系统库

权限系统表 | 全方位认识 mysql 系统库

Oracle RAC Cache Fusion 系列十四:Oracle RAC CR Server Part One

Oracle RAC Cache Fusion 系列十三:PCM资源访问

Oracle RAC Cache Fusion 系列十二:Oracle RAC Enqueues And Lock Part 3

Oracle RAC Cache Fusion 系列十一:Oracle RAC Enqueues And Lock Part 2

Oracle RAC Cache Fusion 系列十:Oracle RAC Enqueues And Lock Part 1

928b669ac987bcd11537db46df571c1a.png

更多干货,欢迎来撩~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis 持久化 + 主从复制+ 集群

2019独角兽企业重金招聘Python工程师标准>>> 一、 Linux 下的 Redis 安装 && 启动 && 关闭 && 卸载 http://blog.csdn.net/zgf19930504/article/details/51850594 注&#xff1a;设置 redis.conf bind***.***.*.(127.0.0.1) redis启动&…

怎么运行c语言_C语言 原来是这样调用硬件的

大家都知道我们可以使用C语言写一段程序来控制硬件工作&#xff0c;但你知道其工作原理吗&#xff1f;网友北极C语言在实际运行中&#xff0c;都是以汇编指令的方式运行的&#xff0c;由编译器把C语言编译成汇编指令&#xff0c;CPU直接执行汇编指令。所以这个问题就变成&#…

更新和插入的并发问题_mysql经典面试题:如何读写分离?主从原理是啥?同步的延时问题...

面试题你有没有做 MySQL 读写分离&#xff1f;如何实现 MySQL 的读写分离&#xff1f;MySQL 主从复制原理的是啥&#xff1f;如何解决 MySQL 主从同步的延时问题&#xff1f;考点分析高并发这个阶段&#xff0c;肯定是需要做读写分离的&#xff0c;啥意思&#xff1f;因为实际上…

maven建立webapp项目时显示Cannot change version of project facet Dynamic web module to 2.5

为什么80%的码农都做不了架构师&#xff1f;>>> 网上查了很多东西都没啥用&#xff0c;其实直接把这段代码加到web.xml头部&#xff0c;自然就不报错了 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.…

HTTPS 原理解析

http://www.cnblogs.com/zery/p/5164795.html 一 前言 在说HTTPS之前先说说什么是HTTP&#xff0c;HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的&#xff0c;也就是明文的&#xff0c;因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐…

kbmmw 5.0 中的REST 服务

目前关于REST 服务的话题越来越热&#xff0c;kbmmw 在5.0 里面开始支持rest。今天我就试一下kbmmw 的 rest 服务。闲话少说&#xff0c;开始。 老规矩&#xff0c;放上两个kbmMWServer1和 kbmMWHTTPSysServerTransport1两个控件。 设置kbmMWHTTPSysServerTransport1的server 属…

多租户saas 架构_[译/注] Force.com 多租户互联网应用开发平台的设计

原文地址 http://cloud.pubs.dbs.uni-leipzig.de/sites/cloud.pubs.dbs.uni-leipzig.de/files/p889-weissman-1.pdf译注&#xff1a;原文发表于 ACM&#xff0c;2009年6月作者Craig D Weissman, CTO, Salesforce.comSteve Bobrowski, Technical Marketing Consultant, Salesfor…

富文本

View Code转载于:https://www.cnblogs.com/baidaye/p/5295448.html

Jenkins持续集成——用户管理

一、基于安全矩阵系统管理 —>Configure Global Security相关权限的作用&#xff1a;其中有一些比较特别的权限&#xff1a;最大的权限是Overall的Administer&#xff0c;拥有该权限可以做任何事情。最基本的权限是Overall的Read&#xff0c;用户必须赋予阅读的权限&#xf…

JAVA Set接口和其常用子类HashSet集合

Set接口&#xff0c;它里面的集合&#xff0c;所存储的元素就是不重复的。 HashSet集合&#xff0c;采用哈希表结构存储数据&#xff0c;保证元素唯一性的方式依赖于&#xff1a;hashCode()与equals()方法。 保证HashSet集合元素的唯一&#xff0c;其实就是根据对象的hashCode和…

python初始化函数_当你学会了Python爬虫,网上的图片素材就免费了

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。加入作者的python学习圈子&#xff1a;1156465813 即可免费获取&#xff0c;资料全在群文件里。资料可以领取包括不限于Python实战演练、PDF电子文档…

第三周作业(一)单元测试

下载vs2015安装包&#xff0c;打开进行安装. 选择颜色 安装完成&#xff0c;需要登录 启动vs 单元测试 1.打开vs界面。 2.新建项目。选择Visual C# 创建类库。 3.点击确定后&#xff0c;进入代码编辑界面。 4.根据书中代码&#xff0c;写入程序&#xff0c;并进行测试。 转载于…

React-Native-lesson

React-Native-lesson 一、React-Native入门指南 lesson2: 认识代码结构lesson4: 学会React-Native布局&#xff08;一&#xff09;lesson6: UI组件lesson8: 自己动手写组件 https://github.com/vczero/toilet React Native完全开发的独立App&#xff0c;支持ES6语法&#xff0c…

1、如何进行字符串常量中的字符定位_Java String:字符串常量池,我相信会有很多朋友不很理解这部分...

作为最基础的引用数据类型&#xff0c;Java 设计者为 String 提供了字符串常量池以提高其性能&#xff0c;那么字符串常量池的具体原理是什么&#xff0c;我们带着以下三个问题&#xff0c;去理解字符串常量池&#xff1a;字符串常量池的设计意图是什么&#xff1f;字符串常量池…

react项目_如何从零开始创建React项目(三种方式)

在开发React项目前最关键的当然是项目的创建&#xff0c;现在的前端工程化使得前端项目的创建也变得越来越复杂&#xff0c;在这里介绍三种从零开始创建React项目的方式&#xff0c;分别是在浏览器中直接引入、使用官方脚手架create-react-app、使用Webpack创建。浏览器中通过标…

# 异运算_小学数学运算三要点:定律、法则与顺序(解析)

很多孩子的数学不好&#xff0c;尤其是女孩子。家长往往认定为数学不好就是孩子不擅长&#xff0c;能力差。其实未必&#xff0c;有的孩子数学不好的原因并不在于智商&#xff0c;而是没有理解到数学的方法与逻辑&#xff0c;比如小学的运算中&#xff0c;很多孩子并没有了解到…

机器学习笔记—再谈广义线性模型

前文从线性回归和 Logistic 回归引出广义线性回归的概念&#xff0c;很多人还是很困惑&#xff0c;不知道为什么突然来个广义线性回归&#xff0c;有什么用&#xff1f;只要知道连续值预测就用线性回归、离散值预测就用 Logistic 回归不就行了&#xff1f;还有一些概念之间的关…

局域网只能看到一部分电脑_win10 网上邻居看不到其它电脑、共享不了文件

最近电脑遇到了局域网文件共享的问题&#xff0c;Win 10 系统在网络和共享中心里无法看到其他电脑&#xff0c;只能看到本机。确认共享已经打开后&#xff0c;通过查找最终解决。下面是解决流程。1.进入&#xff1a;控制面板 – 网络和共享中心 – 更改高级共享设置&#xff0c…

作业1---四则运算

一.需求分析&#xff1a; 除了整数以外&#xff0c;还要支持真分数的四则运算&#xff0c;真分数的运算&#xff0c;例如&#xff1a;1/6 1/8 7/24 运算符为 , −, , 并且要求能处理用户的输入&#xff0c;并判断对错&#xff0c;打分统计正确率。 要求能处理用户输入的真分…

Lesson 001 —— 数据

Lesson 001 —— 数据 数据&#xff08;data&#xff09;是事实或观察的结果&#xff0c;是对客观事物的逻辑归纳&#xff0c;是用于表示客观事物的未经加工的原始素材。数据是信息的表现形式和载体&#xff0c;可以使符号、文字、数字、语音、图像、视频等。 进制 进制也就是进…