我的应用程序中有一个表,它存储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)组合并删除休息。
考虑到桌子的大小,任何人都可以建议我删除行的更好方法。
答案 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