ORALCE 删除含有大数据量的表中的数据

本文介绍了一种快速删除Oracle数据库中大量数据的方法。针对传统DELETE命令效率低下的问题,使用TRUNCATE TABLE命令可以实现秒级清空指定数据表,极大地提高了数据库管理效率。

在解决问题的过程中,有一个问题就是删除一个百万计的数据表,直接用delete耗费时间很大,所以用了oracle自带的

truncate table XXX

这个命令,几秒钟的时间就ok了。

原文:

http://www.db2china.net/?782/viewspace-1155.html

### Oracle SQL 中删除多余数据并保留一条记录(联合去重多个字段) 在 Oracle SQL 中,可以通过 `DELETE` 语句结合子查询的方式实现对多个字段的联合去重,并删除多余的重复数据,只保留一条记录。以下是具体的方法: #### 方法描述 要删除中多余的重复记录,可以根据一组字段进行分组,并保留每组中某特定条件的一条记录(通常是最小或最大的 `ROWID`)。其余不符合条件的记录则被删除。 以下是一个通用模板用于删除重复记录,仅保留每组中 `ROWID` 最小的那一行: ```sql DELETE FROM table_name p WHERE p.ROWID NOT IN ( SELECT MIN(t.ROWID) FROM table_name t GROUP BY t.column1, t.column2, ..., t.columnN ); ``` 在此模板中: - `table_name` 是目标名; - `column1`, `column2`, ..., `columnN` 是需要参与联合去重的字段列; - `MIN(t.ROWID)` 确保每组中只保留具有最小 `ROWID` 的那一行[^2]。 #### 示例代码 假设有如下 `test`,包含字段 `id`, `test01`, 和 `test02`,现在希望通过这三个字段联合去重,并删除多余的重复记录: ```sql -- 删除重复记录,仅保留每组中 ROWID 最小的一条 DELETE FROM test p WHERE p.ROWID NOT IN ( SELECT MIN(t.ROWID) FROM test t GROUP BY t.id, t.test01, t.test02 ); ``` 这条语句的作用是对 `id`, `test01`, 和 `test02` 进行分组,计算每组中最小的 `ROWID` 并将其保留下来,而其他重复记录将被删除[^2]。 #### 性能优化建议 当处理大规模数据时,上述方法可能会面临性能瓶颈。为了提升效率,可以采取以下措施: 1. **创建索引**:在参与联合去重的字段上建立复合索引,例如针对 `(id, test01, test02)` 创建索引,这有助于加速分组操作[^4]。 ```sql CREATE INDEX idx_test_group ON test(id, test01, test02); ``` 2. **分区删除**:如果数据量过大,可以直接按批次逐步删除部分数据,而不是一次性完成整个的操作。 3. **使用临时**:先将去重后的结果存储到一个临时中,再重新导入原替换旧数据。 #### 注意事项 - 如果含有大量 `NULL` 值,需特别注意它们的行为,因为在大多数数据库系统中,`NULL != NULL` 成立[^5]。 - 执行此类删除操作前应备份原始数据以防误删重要信息。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值