(面试题) 一亿条数据中删除500条

[复制链接]
查看11 | 回复9 | 2011-2-18 11:43:34 | 显示全部楼层 |阅读模式
假设一个table里有一亿条数据,需要删除其中的500条,有什么比较快速的方法?
碰到的一个面试题,请教各位大侠!
我想到了以后方法:
1. 并行处理。
2. delete的where 字段加 索引。
3. table partition。

回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
1?
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
任意500条我觉得怎么删都挺快。。。。。
实在想不出有啥办法能再快点

回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
本帖最后由 solomon_007 于 2012-2-2 15:20 编辑
我只知道根据ROWID delete是最快的
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
gyhgood 发表于 2012-2-2 15:12
任意500条我觉得怎么删都挺快。。。。。
实在想不出有啥办法能再快点


回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
先要问问这500条是根据什么条件确定的
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
我有个没有经过测试的方法:
1.CREATE TABLE NEWTABLE AS SELECT * FORM OLDTABLE WHERE .......
2.DROP TABLE XXX PURGE
3.RENAME OLDTABLE TO OLDTABLE
应该可以减少redo和undo的写入吧,不过只有500条记录而已。
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
删除的500条是相邻条件的吧??那索引就可以了,没有多慢
并行之类的
关键是删除什么样的500条,重建一般没有必要,删的太少了
回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
本帖最后由 solomon_007 于 2012-2-2 16:22 编辑
如果delete量比较大(比例较高就用7楼的),可参考下面。。。
declare
l_count number := 0;
l_total number := 0;
cursor cur is
select rowid from t where ...;
begin
for rec in cur loop
delete from t where rowid = rec.rowid;
l_total := l_total + 1;
l_count := l_count + 1;
if (l_count >= 1000) then
commit;
l_count := 0;
end if;
end loop;
commit;
dbms_output.put_line('deleted rows: ' || l_total);

end;

回复

使用道具 举报

千问 | 2011-2-18 11:43:34 | 显示全部楼层
solomon_007 发表于 2012-2-2 16:14
如果delete量比较大(比例较高就用7楼的),可参考下面。。。
declare

正解
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行