使用PL/SQL删除百万条记录的大表

使用PL/SQL删除百万条记录的大表:

最近开发人员对测试环境数据库进行了压力测试,数据库中产生了大量的脏数据。有几张大表里数据量均在百万甚至千万条的记录数。开发人员现提出需求如下:

只清理其中的部分脏数据,不允许对这些表使用truncate操作。于是就有了下面的PL/SQL清理脚本:

1.编写删除数据表数据的脚本内容如下:

$ cat data_del.sql

set serveroutput on
show serveroutput
DECLARE 
V_LOGNUM NUMBER;
V_NEEDARC NUMBER;
BEGIN 
SELECT count(1) INTO V_LOGNUM FROM V$LOG; 
LOOP 
LOOP 
SELECT count(1) INTO V_NEEDARC FROM V$ARCHIVE; 
IF V_NEEDARC < V_LOGNUM - 1 THEN 
 EXIT; 
ELSE 
 DBMS_LOCK.SLEEP(60); 
END IF; 
END LOOP; 
 
DELETE FROM T_USER.T_TABLE_NAME WHERE mobile=‘13800138000‘ AND rownum < 100; 
IF SQL%ROWCOUNT = 0 THEN 
 EXIT; 
END IF; 
 COMMIT; 
END LOOP; 
END;
/

2.编写调用脚本:

$vim clear_dirt_data.sh

source ~/.bash_profile

sqlplus -s mytest/[email protected] <<EOF

@data_del.sql;

exit;

EOF

此脚本程序,通过利用dbms_output.sleep()过程,在删除过程中当需要归档的日志文件达到认定的限制时,使删除过程暂时停止,等待ARCH进程将日志文件归档后再继续进行,从而达到避免归档日志文件来不及归档,导致数据库挂起的问题。 此方法适用于Oracle的各个版本。

时间: 2024-08-17 12:09:55

使用PL/SQL删除百万条记录的大表的相关文章

mysql删除一条记录

mysql如何删除一条记录 delete from 表名 where 条件 实例: use db1 delete from tb1 where id = 1; 原文地址:https://www.cnblogs.com/effortsing/p/10393229.html

Entity Framework 删除一条记录包括所有子记录

Entity Framework 要删除一条记录,当其含有子记录时会报错: 操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null.对关系作出更改后,会将相关的外键属性设置为 null 值.如果外键不支持 null 值,则必须定义新的关系,必须向外键属性分配另一个非 null 值,或必须删除无关的对象. 解决办法: 先删除子记录,再删除父记录.子记录必须是从数据库查出来的. //查询子记录 var contas = ConsignLighteringContaRepository.E

PL/SQL + Oracle客户端 配置记录

oracle一直都没怎么用. oracle pl/sql也是在别人帮助下完成配置. 这次电脑重装后,自己搞定总结了下怎么配置. 1.下载Oracle 客户端. 安装的版本是win64_11gR2_client.zip,587 MB. 链接地址在官网比较难找.在官网下载还需要账号和密码. 安装好后,默认是安装在 D:\app 后面我们需要用到的是D:\app\client\Administrator\product\12.1.0\client_1 2. 下载绿色版本pl/sql 绿色是因为懒得安装

SQL 将一条记录中多个字段的值拼接为一个字段 &amp;&amp; 将多行数据合并成一行,并且拼接CONVERT() 、for xml path的使用

接着上篇文章的订单表(商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小) ,价格的时间段,商品价格) 一.将一条记录中多个字段的值拼接为一个字段 现要求将两个时间段合并为一个字段,应该如何做呢? 先来看下理想的结果: 查询出的时间段合并到一起了: 代码如下,将查询的字段用+'你想要的符号' + 拼接即可 select item,act_id,loc_id,convert(varchar(100),start_date,20)+ '-' +convert(varchar

sql语句去除重复记录(多表连接的查询)

--处理表重复记录(查询和删除) /****************************************************************************************************************************************************** 1.Num.Name相同的重复值记录,没有大小关系只保留一条 2.Name相同,ID有大小关系时,保留大或小其中一个记录 ********************

PL/SQL 导入excel表格到oracle数据表

通过使用PL/SQL 批量查询取数时,将excel中的每一列数据复制黏贴进新建的中间表,黏贴时会有贴歪的情况,也就是某些列会从第二第三行开始插入整列,导致数据乱掉,然后好像又不支持批量删除整列数据,所以一次性导入整张excel表是最佳方法啦. 第一步: 将excel中要插入oracle的数据全部选中:(必须选中,不然导不进数据库) 第二步: 然后另存为:文本文件(制表符分隔)(*.txt) 第三步: 然后进入PL/SQL 选择工具->文本导入器 第四步: 进行文件的选择: 第五步: 选择文件后就

PL/SQL Developer导入、导出表结构和表数据

在表的所有者不能改变的情况下,可以使用导入导出表结构和表数据的方法,将表移动到你想要的所有者下(注:特别是建立表的时候如果以sysdba的身份登录的话,所有表的所有者都为sys,此时会对你用c#访问数据库产生麻烦,我在我的另一篇文章中也提到<.NET连接Oracle数据库的错误,pl/sql中的myobjects过滤器 >),此时你只能用这种方法改变所有者. 导出表结构: Tools(工具)-->Export User Objects(导出用户对象) -->选择要导出的表(包括Se

借助PL/SQL Developer将Oracle某用户数据表导出

使用PL/SQL Developer登录你需要备份的数据库:  选择工具->导出用户对象:  在对象列表中选择需要备份的对象,再选择一个sql类型的输出文件,点击[导出],这只是导出数据结构:  选择工具->导出表:  在列表中选择需要导出数据的表,再选择[SQL插入],选择一个sql类型的文件,点击[导出],这一步是把数据导出数据库.  这样就得到两个sql,分别是备份数据结构和备份数据的.

mysql 造1亿条记录的单表--大数据表

读写文件 背景及木:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXISTS createManyTable; create PROCEDURE createManyTable() BEGIN DECLARE i int; DECLARE fileName VARCHAR(30); set i=1; while i<251 DO SET fileName=CONCAT