一亿行删除或修改一千万行的思路总结续
来源:互联网 发布:windows系统怎么录屏 编辑:程序博客网 时间:2024/05/02 02:03
接着上一篇文章:
一亿行删除或修改一千万行的思路
思路二: CTAS + RENAME
因为要在对数据库及其他应用影响最小的情况下做
如果直接对表进行删除则会出现应用因为等待数据释放锁而等待
而且常规的DELETE语句,会生成大量的UNDO和REDO
而且表上如果有大量索引的话,导致删除还会更慢
而且可能会造成大量的空数据块,如果有扫描大量行的操作,空块太多,也会导致性能下降
如果可以停止业务,防止对此表的更新
那么CTAS + RENAME也是个不赖的选择
这种方法只适用于没有业务发生的情况,对于大多数OLTP系统还是不适用的
由于CTAS是DDL语句,基本没有太多UNDO的生成,如果CTAS失败了,重新在执行一遍即可
大致过程如下
比如:对象表为test_01,我想要删去日期(deal_date)为20120301的数据
① CTAS的方法创建一个新表,建表条件为删除条件的对立条件,可考虑nologging+并行
例如:create table test_02 as select * from test_01 where deal_Date<>'20120301'
② 在新表上建立相关索引和约束
③ 重命名新表为老表名字
例如:ALTER TABLE test_02 RENAME TO test_01
④ 如果没问题 删除老表
⑤ 最后查看和该表相关的存储过程、函数等,重新编译
如果用CTAS在建表的时候会对原表建立一致性读的
如果这时候对原表有插入或更新,就需要访问undo表空间然后完成一致读
而且一旦失败需要全部回滚,数据量这么大,这样做的风险是巨大的
我们可以访问dba_extents视图,通过rowid将原表划分成许多不重叠的区域
然后起多个job,job中通过rowid访问然后删除数据
删除完后的区域写日志,这样即使中途失败通过划分的rowid区域和日志都是可以重启的
而且速度要比bulkcollect好,因为bulk collect是缓存100到200条一delete,一个区域直接一个delete
但是这种方式最好需要先在表上加读取锁,不然有insert和update会破坏原来的rowid划分
这种通过rowid的思路,我会在下一篇博客继续介绍
未完待续.....
- 一亿行删除或修改一千万行的思路总结续
- 一亿行删除或修改一千万行的思路总结
- SQL 删除或修改
- 批量删除或修改
- 修改或删除脚注或尾注的“横线”
- 删除对象的思路
- mysql批量删除或修改
- 怎么修改或删除我上传的资源文件啊!
- 【转载】修改或删除Office 2007的文档密码
- SQL2000删除或修改数据库列的默认值
- 如果修改或删除手机的内置程序
- swing实现对JTable的修改或删除
- swing实现对JTable的修改或删除
- 不小心删除或修改Xcode的某一库文件
- 删除或修改本地Git保存的账号密码
- Git本地保存账号密码的删除或修改
- windows删除或修改本地Git保存的账号密码
- 一千万以内的自守数
- HDU OJ 1083 Courses 【二分图匹配之最大匹配】
- VBA中使用正则表达式
- .NET Framework初步理解
- BufferedWriter 和 BufferedReader 的基本用法,附演示程序。以及一个复制文本文件的程序
- openlayer通过SLD改变图层Feature的样式
- 一亿行删除或修改一千万行的思路总结续
- 使用事件驱动模型实现高效稳定的网络服务器程序
- 创新过程管理
- 使用正确的dtd声明和entityResolver避免saxReader联网验证
- gspca驱动移植介绍
- xml--dom4j SAXReader解析
- 利用openstreetmap在android应用中添加地图
- yuv和yCbCr的差异
- /mnt/sdcard/Android/data/<package> 卸载时自动删除这个目录(默认缓存目录)