从巨大的表中删除记录

时间:2015-04-23 21:22:17

标签: sql oracle oracle11g database-administration

我的应用程序中有一个表,它存储pid(主键)和(inst id)等数据,这些数据存储保存历史数据,而最新的inst id的行具有最新数据。

示例数据如下:

例如:tablename是TESTTABLE(pid号,instid号,datacol1 varchar2(100),datacol2 date);

pid     instid      datacol1    datacol2
--------------------------------------- 1 18 sample1 2/05/2012
1 17 sample2 2/04/2013
1 16 sample2 2/04/2013
2 15 sample3 1/04/2012
2 14 sample3 2/04/2012

以上结果,pid 1 id的最新记录是instid 18,pid 2的最新记录是15。 现在该表已经增长了数十亿条记录,而且规模太大(约1 TB) ,计划清除历史数据,保持最新(pid,instid)组合并删除休息。

考虑到桌子的大小,任何人都可以建议我删除行的更好方法。

3 个答案:

答案 0 :(得分:1)

我的建议是一个多阶段操作,包括1)创建一个构建新表的提取脚本/ proc,只保存所需的行。这将提出需要进行多少次修订的问题,这是一个必须回答的问题。设计它以将输出放入新表中。一旦用户编写并测试和批准,然后选择暂停新活动的时间,运行sql程序来创建新表。将整个旧表存档到允许您有选择地还原的介质中。截断原始表,并使用步骤1提取中的内容重新加载它。测试,测试,测试并在每一步都获得用户收购。

答案 1 :(得分:1)

因为你拍摄了数十亿条记录"和"计划清除历史数据"我建议你应该去表分区可能是按周或月分区,然后你可以轻松删除旧分区。

是的,这需要一些设计变更,但它的价值确实可以为应用程序带来好处,并为长期运行带来好处。

答案 2 :(得分:0)

如果您想保留最新的代码,此代码非常有用。

WITH C AS(
    SELECT  ROW_NUMBER() OVER(PARTITION BY pid ORDER BY pid DESC) AS Rn
            ,pid
            ,instid
            ,datacol1
            ,datacol2
    FROM TESTTABLE
)
DELETE FROM C
WHERE Rn != 1

SELECT * FROM TESTTABLE