广告
返回顶部
首页 > 资讯 > 数据库 >数据库大数据量删除的分析
  • 557
分享到

数据库大数据量删除的分析

2024-04-02 19:04:59 557人浏览 独家记忆
摘要

这篇文章主要介绍“数据库大数据量删除的分析”,在日常操作中,相信很多人在数据库大数据量删除的分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库大数据量删除的分析”的疑惑

这篇文章主要介绍“数据库大数据量删除的分析”,在日常操作中,相信很多人在数据库大数据量删除的分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库大数据量删除的分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

概    述

在您能够找到大量删除的方案和流程之前,您必须处理好一些战略性(长期)和策略性(短期)问题。

在战略层面您会有这样的问题:您为什么要删除?您希望从中得到什么?如果您达到了初始的目标,接下来的策略(如果有)是什么?您有什么样的证据能够证明它值得你付出努力(人和机器)?您有没有仔细想过即使修复了旧的问题也可能带来新的问题?

在策略层面您可能会问决定采用的工作流程的一些细节问题:有哪些资源?您是否允许长时间中断服务或者短时间的中断服务?在或者根本不允许中断任何服务?如果应用层序必须在删除任务执行阶段运行,那么,它是否可以减少部分功能或者降低一下执行性能?您对您的系统是否足够了解呢?您是否查看过oracle最近有哪些特性或者增强可用帮助您安全(和快速的)完成工作?

让我们看几个我最近参与的几次在线交谈的一些想法:

设想 A

在OTN论坛中最近有一个贴子描述了“大量删除”的一个极端例子,用户有一个4tb的普通堆表,其中保留了3年数据,现在想将数据减少到每天分区并保留15天历史数据。可能促使人们大量删除数据是为了清理大量的历史数据,当然,最好的策略是以这样的目标设计系统,将删除数据变成简单的“删除分区”,这样可以做到几乎没有开销。

在这个特殊的例子中,用户(在我看来)是非常幸运的,因为他们想清除大部分数据并且只保留一小部分数据。他们需要花费一些时间去计划和测试所有相关细节(参照完整性和索引等),但是所有的这些都需要创建一个合适的范围分区表,将此表作为交换后的表,然后每天开始进行分区,之后等待16天,在删除最后的分区以清除最近三年的数据。

另外一些人可能没有那么幸运,我常常看到类似一张表中有几年的数据,而且需要按照周或者月进行分区,然后保留两年或者三年的数据,“交换一次等待三年”的方式并不可取,但是删除几年或者复制几年数据带来的开销同样是不可取的。

设想 B

不久之前我收到的一个问题是某人来询问关于大量数据删除的策略,因为根据他们之前经验,快速删除大量数据前先删除全部索引,并在之后重建索引,最近他们测试一个案例,尽管这种方法和“仅仅删除它”的时间差异非常小,但似乎采用稍微复杂(删除索引在重建/因此有风险)的方式并没有很大好处。

这就提出了一个有趣的问题:多大的数据量删除才算是“大量数据”?这个人删除了2500w行数据,这听起来相当大,但是它仅仅是表中的4%,所以它并不是那么的庞大(相对而言);此外表已经被分区,这就降低了几分风险,另外一方面,它至少包含一个全局唯一索引,这就有点让他讨厌了,然而这台服务器可以将该任务并行加到16,因此在绝对值上来说,每个并行任务约为150w行数据,所以可能它并不是真的很大。 

事实上,无论采用什么方法,完成任务的时间大约为17分30秒,但值得注意的是,如果我们用简单的删除策略,在任务期间其他用户仍然可以使用该表,由于并发使用该表,删除操作可能需要更长时间,由于争用和读一致性,要求用户活动可能会更慢(注:按照特定的顺序一次删除一个分区有什么好处么?),并且始终存在和死锁威胁而导致的灾难,删除这4%的数据大概要多久一次,可能它的数据量大致相当于两年内中的一个月的数据,所以可能每个月定期清理一次,但可能不会有人介意因为"drop/delete/rebuild"失去访问权限15分钟,这些操作总是有一些好处的,大多数的索引在删除数据之后可以更加高效的运行。

注意事项

当"大数据量删除"浮现在你的脑海中时,我希望这两个例子可以让你知道需要考虑些什么?因此,在我们开始"怎样"之前,先让我们来对可能出现的情况和与之相关的想法进行分类。 

我想我过去遇到过三种基本删除模式和两种删除原因。

删除原因非常简单:

1.提升性能。

2.回收空间 - 希望可能是数据库或者特定表空间的空间;它最终可能是数据库之外的磁盘空间。

常见删除模式有:

1.根据时间来对表中的数据进行删除。

2.根据表中数据处理完成时间来进行删除。

3.从表中删除一类数据(这可能意味着我们要创建两张表,或者分区表(列表分区),或许非分区表)。 

一旦我们找出原因,我们就会提出一些关键问题--如何删除数据才能提高性能?我们如何通过其他的方式来提高效率(例如改进索引)?通过删除数据释放的空间是否可以立即使用,或者还必须做些其他操作?删除的带来的负面影响是什么?我们可能采取的进一步措施带来的负面影响又是什么?我们是否有真实的平台?我们可以对预测的停机时间进行验证,执行相应的任务,测试不可以预测的负面影响有哪些? 

理解模式非常重要,但在使用数据库时却经常被忽略。当你删除数据时,在表块中和索引块中释放出相应的空间,当新数据出现时可能会重新使用该空间。但由于这种方式表中释放的空闲空间意味着新数据的物理分布与当前其他数据所遵循的分布模式不同,这意味着随着时间的推移,因为模式的不同查询(a)可能变得非常低效,优化器(b)可能认定某个索引不在是最好的选择,因为数据分布模式的改变导致索引的"clustering_factor"出现了变化。 

我提出的三种主要的删除模式,是基于他们对性能的威胁程度。如果假设你是第一次进行大数据删除,那么最容易考虑这些模式。有些时候,只有你进行了几次删除周期后威胁才会出现。如果按照数据的原始到达日期删除,很可能会在表段的开头(前几个区)留下很多的空闲块,这就意味着新插入的数据可能会插入到表段开头的一组区中,而不是表段的末尾。具体来说,假设有一个包含100000个块的表,你刚刚删除该表中前5000个块中的数据,接下来插入的几十万行数据将插入到1-5000的块中,而不是100001-105000;尽管表中的绝对位置已改变,但数据的模式不会改变。 

如果是根据"处理完成"日期进行删除,那么初始删除模式可能有所不同 - 也许前1000个数据块实际上是空的,接下来1000个块的使用量下降到20%,在接下来2000个块使用量下降到40%,在接下来4000个块使用量下降到70%。随着时间的推移,新的数据将分布在比以往更多的数据块中(也许你删除的块中有一些不允许被重用直到你进行下一次大量的删除操作)。如果不参考实际应用,很难想象当大量删除发生时,为什么任何人的数据可能显示这种"衰减"模式 - 但你可能会想到一个应用获得了1、2、3或者5年的借贷协议。

在最后一种模式中 - 删除整个数据类别,"借贷"可能是很好的一个例子。出于某些原因我们可能决定为5年贷款创建一张单独的表,因为贷款已经成为业务的重要部分 - 所以我们必须从当前的贷款表中删除他们。当然,这种就是刚刚删除表中每个块10%-30%数据的模式。我们可能发现这些块均没有出现在空闲空间中,或者我们发现在接下来的九个月里,我们在表的每个块中插入了少数几行数据,而人们会抱怨“2016年的性能非常的差”。

索    引

当然,我们在研究数据模式时还应该考虑索引中的模式(和副作用)。因为我们从少数相邻块中删除所有行,那即使其中的一个场景也意味着我们可以高效的从表中删除数据,我们还需要考虑表中每个索引都会发生什么事情。非常紧凑的表删除可能导致非常分散的索引删除,因为随机I/O - 读(通过会话)和写(数据库写入),可能需要很长的时间,可能不会给我们任何后续空间和性能好处。

考虑从"股票价格"表中删除2001年4月1日的数据:所有的行都将一起到达,所以我们可以清空表中连续的几百个块 - 如果我们有一个索引(报价_日期,股票_代码),我们将清空索引中的几百个连续的块,如果这是我们驱动删除的索引,则不会产生过多的I/O;如果我们有一个索引(股票_代码,报价_日期) - 我们很可能会不得不访问几千个索引叶块来删除每个索引条目!因为要执行大量的随机I/O,删除可能非常缓慢。OTN中关于插入和删除最常见的抱怨之一就是"db file sequential read"等待;执行计划中不会告诉我们关于索引维护的开销,所以很容易忘记一个大的删除操作会导致非常缓慢的随机I/O。(有趣的是SQL Server会告诉你删除操作会维护哪些索引)。

索引维护对于大的删除操作影响如此之大 - 而且会产生持久的后果 - 这一点确实值得我们思考。实际上,我们可以设计一种策略,根据每个索引的定义和实际使用情况,对单个表上的索引进行不同的处理。对于给定的表,我们可以删除(或者标记不可以)和重建一些索引,与此同时保留一部分索引,在删除后进行重建索引或者合并索引。

到此,关于“数据库大数据量删除的分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 数据库大数据量删除的分析

本文链接: https://www.lsjlt.com/news/63644.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 数据库大数据量删除的分析
    这篇文章主要介绍“数据库大数据量删除的分析”,在日常操作中,相信很多人在数据库大数据量删除的分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库大数据量删除的分析”的疑惑...
    99+
    2022-10-18
  • MySQL 删除数据 批量删除(大量)数据
    在删除数据的时候根据不同的场景使用不同的方法,比如说删除表中部分数据、删除表的结构、删除所有记录并重置自增ID、批量删除大量数据等,可以使用delete、truncate、drop等语句。 一、方法分类 二、具体方法 类型语句删...
    99+
    2023-08-30
    mysql 数据库 java
  • oracle大数据量分批删除
    很多时候,我们要清理一个大表的数据,比如几个亿,业务还不能停,还只能delete,这种情况下分批删除是个好办法。 create or replace&n...
    99+
    2022-10-18
  • 大数据量删除的思考 - 2
        在这个简短系列的第1部分中,我提供了两个场景的非正式描述,在这些场景中,我们可以从表中进行大规模删除。没有一个具体的例子,很难想象删除数据的性质和可用的访问...
    99+
    2022-10-18
  • 大数据量删除的思考(四)
    在本系列的前一期文章中,我制作了一些图,突出显示了按表扫描执行大量删除操作和按索 引范围扫描执行大量删除之间的主要区别。 根据所涉及的数据模式,选择正确的策略可能对随机I/Os 的数量、生成的undo的数...
    99+
    2022-10-18
  • 大数据量删除的思考 - 1
        在最近一篇关于从表中删除列的文章里,我留下了一个悬而未决的问题,删除列之后你应该/可能会做什么?因为删除列只不过是“大量删除”的特殊情况。在这篇文章中,我计...
    99+
    2022-10-18
  • 大数据量删除的思考(二)
    在这个简短系列的第1部分中,我提供了两个场景的非正式描述,在这些场景中,我们可以从表中进行大规模删除。没有一个具体的例子,很难想象删除数据的性质和可用的访问路径会产生大数据量删除操作对系统的性能影响...
    99+
    2022-10-18
  • 数据库中如何批量删除数据
    这篇文章将为大家详细讲解有关数据库中如何批量删除数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在一个Oracle数据库运行过程中,有时候会遇到要批量删除数据的情况...
    99+
    2022-10-18
  • mysql怎么批量删除数据库中的数据
    mysql怎么批量删除数据库中的数据?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql批量删除数据库中数据的方法:通...
    99+
    2022-10-18
  • .NET多种数据库大数据批量插入分析
    本篇内容介绍了“.NET多种数据库大数据批量插入分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!功能介绍 (需要版本5.0.45)大数据操...
    99+
    2023-06-25
  • mysql快捷删除大量数据的方法
    这篇文章主要介绍了mysql快捷删除大量数据的方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql捷删除大量数据的方法:首先创建临时表,...
    99+
    2022-10-18
  • oracle如何快速删除大量数据
    要在Oracle中快速删除大量数据,可以尝试以下方法:1. 使用TRUNCATE语句:TRUNCATE语句可以快速删除表中的所有数据...
    99+
    2023-10-08
    oracle
  • oracle怎么快速删除大量数据
    要快速删除大量数据,可以使用Oracle的DELETE语句结合一些优化技巧来实现。以下是一些可以加快删除大量数据速度的方法:1. 使...
    99+
    2023-08-31
    oracle
  • Mysql在大表中删除大量数据的优化
    假设有一个表有3000万条记录,需要在业务不停止的情况下删除其中status=1的所有记录,差不多有600万条。 如果直接使用delete from tab_name where status=1; 会触发lock wa...
    99+
    2023-09-01
    mysql 数据库 sql
  • mysql 大表批量删除大量数据的实现方法
    问题参考自:https://www.zhihu.com/question/440066129/answer/1685329456 ,mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业...
    99+
    2022-05-11
    mysql 大表批量删除 mysql 大表批量
  • 数据库删除重复数据
    当数据库数据量大的时候,删除重复元素是很讨厌的,有时候怎么也写不对,闲下来整理一下删除 重复数据的sql,数据表是之前看mysql教学视频的素材,但是找不到哪...
    99+
    2022-10-18
  • 数据库如何删除数据
    drop (删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。 drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于...
    99+
    2023-09-01
    数据库 sql mysql
  • mysql删除大量数据会不会锁表
    MySQL在删除大量数据时会进行锁表操作,这可能会导致其他查询或写操作被阻塞,从而影响数据库的性能和吞吐量。 具体来说,MySQL在...
    99+
    2023-10-23
    mysql
  • MySQL 删除数据库
    MySQL 删除数据库使用 mysqladmin 删除数据库使用普通用户登陆mysql服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。所以我们这边使用root用户登录,root用户拥有最高权...
    99+
    2022-10-18
  • MongoDB 删除数据库
    rszhou:PRIMARY> show dbsadmin 0.000GBlocal 146.588GBdb_chunqiu 1163.1...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作