从巨大的 table 中删除记录
Deleting records from a huge table
我的应用程序中有 table,它存储诸如 pid(主键)和(inst id)之类的数据,它存储历史数据,并且具有最新 inst id 的行具有最新数据。
示例数据如下:
例如:tablename is TESTTABLE (pid number,instid number,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。
现在 table 已经增长了数十亿条记录,而且大小太大了(大约 1 TB)
,计划清除历史数据,保留最新的(pid,instid)组合并删除其余的。
考虑到 table 的巨大规模,任何人都可以建议我删除行的更好方法是什么。
我的建议是一个多阶段操作,包括 1) 创建一个提取 script/proc 来构建一个新的 table,只保留需要的行。这将提出需要多少最近修订的问题,这是一个必须回答的问题。将其设计为将输出放入新的 table。一旦编写并测试并得到用户认可,则选择一个时间暂停新的activity、运行 sql 程序来创建新的table。将整个旧 table 存档到允许您有选择地恢复的媒体。 T运行cate 原始 table,并使用步骤 1 提取中的内容重新加载它。测试、测试、测试,每一步都得到用户的认可。
既然你考虑了 "billions of records " 和 "planning to clear history data" 我建议你应该去 table 分区可能是按周或按月分区,然后你可以轻松删除旧分区。
是的,这需要一些设计更改,但它值得为应用程序带来好处并长期受益 运行。
如果您只想保留最近的代码,此代码会很有用。
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
我的应用程序中有 table,它存储诸如 pid(主键)和(inst id)之类的数据,它存储历史数据,并且具有最新 inst id 的行具有最新数据。
示例数据如下:
例如:tablename is TESTTABLE (pid number,instid number,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。 现在 table 已经增长了数十亿条记录,而且大小太大了(大约 1 TB) ,计划清除历史数据,保留最新的(pid,instid)组合并删除其余的。
考虑到 table 的巨大规模,任何人都可以建议我删除行的更好方法是什么。
我的建议是一个多阶段操作,包括 1) 创建一个提取 script/proc 来构建一个新的 table,只保留需要的行。这将提出需要多少最近修订的问题,这是一个必须回答的问题。将其设计为将输出放入新的 table。一旦编写并测试并得到用户认可,则选择一个时间暂停新的activity、运行 sql 程序来创建新的table。将整个旧 table 存档到允许您有选择地恢复的媒体。 T运行cate 原始 table,并使用步骤 1 提取中的内容重新加载它。测试、测试、测试,每一步都得到用户的认可。
既然你考虑了 "billions of records " 和 "planning to clear history data" 我建议你应该去 table 分区可能是按周或按月分区,然后你可以轻松删除旧分区。
是的,这需要一些设计更改,但它值得为应用程序带来好处并长期受益 运行。
如果您只想保留最近的代码,此代码会很有用。
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