如何提升两个表关联删除的效率

[复制链接]
查看11 | 回复5 | 2011-5-26 14:53:25 | 显示全部楼层 |阅读模式
我有两张表:表A和表B。表A包含于表B。
我要实现:在往表B插入数据前,先对表B进行删除操作,删除的是表A在表B的记录。
因为我的表的数据量很大,执行Delete操作很耗时,所以想请问有没什么比较快的方法可以实现?谢谢!
回复

使用道具 举报

千问 | 2011-5-26 14:53:25 | 显示全部楼层
"表A包含于表B" 具体 是怎么设置的?
回复

使用道具 举报

千问 | 2011-5-26 14:53:25 | 显示全部楼层
楼主的意思是表A和表B通过一个共同的关键字段K1关联,通过K1将表B与表A进行内连接之后得到的记录都应该删除,那能否在表A和表B上都对K1建立索引,通过索引来确定要删除的记录应该还是很快的。
不过还提到表B的数据量很大,删除操作会产生大量的回滚日志,如果直接通过一个delete语句操作很可能耗尽数全部的据库日志空间,最终导致事务回滚,这样删除的操作就好耗费非常多的时间进行回滚。可以考虑通过一个循环,每次删除1万或者10万行的记录,这样可以避免日志空间耗尽的事务回滚,不过事务的完整性就比较难控制了。
还有一个更大胆的做法,前提是表B和表A的记录操作的时候是静止不会变动的,而且表B不会有被其他表有外键依赖。做法是建一张临时表B1,将需要保留的数据,通过LOAD CURSOR复制到表B1,接着用ALTER TABLE 表B ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE,将表B清空,接着再用一次LOAD CURSOR将数据从B1重新导入表B,最后还是用相同的方法将B1清空。整个过程都是用LOAD实现,不产生日志,速度很快,但是LOAD的时候要加上NONRECOVERABLE,否则使用归档日志模式的数据库表空间将会被置于备份暂挂状态,对表B有外键依赖关系的其他表也会被置为CHECK PENDING状态,需要用SET INTEGRITY命令重新进行检查,还有LOAD命令只能在数据库服务器本机执行,脚本不能在客户机上执行。
回复

使用道具 举报

千问 | 2011-5-26 14:53:25 | 显示全部楼层
楼上的第二中方法挺好,因为需要的数据比较少,这样先把保留的弄出来,然后直接 alter table .. 哈哈,不错
回复

使用道具 举报

千问 | 2011-5-26 14:53:25 | 显示全部楼层
mark。。。。ls可行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行