使用PL/SQL删除百万条记录的大表 推荐
2012-04-29 02:42
239 查看
使用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/passwd@mydb <<EOF
@data_del.sql;
exit;
EOF
此脚本程序,通过利用dbms_output.sleep()过程,在删除过程中当需要归档的日志文件达到认定的限制时,使删除过程暂时停止,等待ARCH进程将日志文件归档后再继续进行,从而达到避免归档日志文件来不及归档,导致数据库挂起的问题。 此方法适用于oracle的各个版本。
最近开发人员对测试环境数据库进行了压力测试,数据库中产生了大量的脏数据。有几张大表里数据量均在百万甚至千万条的记录数。开发人员现提出需求如下:
只清理其中的部分脏数据,不允许对这些表使用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/passwd@mydb <<EOF
@data_del.sql;
exit;
EOF
此脚本程序,通过利用dbms_output.sleep()过程,在删除过程中当需要归档的日志文件达到认定的限制时,使删除过程暂时停止,等待ARCH进程将日志文件归档后再继续进行,从而达到避免归档日志文件来不及归档,导致数据库挂起的问题。 此方法适用于oracle的各个版本。
相关文章推荐
- 使用PL/SQL删除百万条记录的大表
- 源码-Oracle数据库管理-第十四章-记录与集合-Part 1(使用PL/SQL记录)
- 使用一条SQL语句删除表中重复记录
- 使用PL/SQL 记录变量接收游标数据
- PL/SQL:记录类型 (定义,使用,注意点)
- PL/SQL 记录集合IS TABLE OF的使用
- 在PL/SQL中使用命令创建和删除表空间
- 使用复合数据类型——PL/SQL记录
- 在PL/SQL Developer复制一条记录,快速提交这条记录,而不用使用insert into.
- 如何使用Oracle查询并删除重复记录的SQL语句
- 使用PL/SQL快速删除用户下的所有表数据
- 使用一条SQL语句删除表中重复记录
- 如何使用Oracle查询并删除重复记录的SQL语句
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测 推荐
- 扩展LINQ to SQL:使用Lambda Expression批量删除数据 推荐
- PL/SQL 记录集合IS TABLE OF的使用
- PL/SQL_使用复合数据类型1(PL/SQL记录)
- 使用SQL语句对重复记录查询、统计重复次数、删除重复数据
- 转:使用一条SQL语句删除表中重复记录
- 使用SQL语句对重复记录查询、统计重复次数、删除重复数据