我们的Orbeon Form 4.6 PE在我们的生产环境中运行了6年。我们有大约200个表单,此时orbeon_form_data_attach
增长到15 GB。我们一直在考虑如何从此表中归档记录,并删除早于6个月创建的记录。
以下是我们在生产数据库副本中尝试的查询,该表将大小从15 GB降至6 GB。
DELETE orbeon_form_data, orbeon_form_data_attach
FROM
(
SELECT document_id
FROM orbeon_form_data
WHERE app <> 'orbeon' AND
form <> 'builder' AND
last_modified_time <= DATE_SUB(curdate(), INTERVAL 6 MONTH)
) as deletions
INNER JOIN orbeon_form_data
ON deletions.document_id=orbeon_form_data.document_id
LEFT JOIN orbeon_form_data_attach
ON orbeon_form_data.document_id = orbeon_form_data_attach.document_id ;
我们与Orbeon Forms集成并使用Orbeon数据库数据的应用程序不需要6个月前提交的表单数据。
如果我们在生产中继续使用此查询,我们是否真的想知道Orbeon应用程序本身可能出现的副作用。
答案 0 :(得分:0)
我发现有两个问题:
orbeon_form_data
有点像日记,其中添加了新行,但“从不”更新或删除。比如,一个新的表单实例(文档ID)是在1年前创建的,并且今天刚刚更新:您将有2行具有相同的document_id
但不同的last_modified_time
,并且您的查询将被删除本文档是因为其中一个人的last_modified_time
年龄超过6个月。所以,我建议:
如果这不能删除足够的数据,请在上面的查询中尝试通过以下查询替换( … ) as deletions
中的子查询。非常,非常非常,在运行时要小心:重新阅读查询以确保它有意义,并在对任何敏感数据运行之前备份数据。
SELECT document_id
FROM orbeon_form_data d,
(
SELECT document_id, max(last_modified_time) last_modified_time
FROM orbeon_form_data
WHERE app <> 'orbeon' AND
form <> 'builder'
GROUP BY document_id
) l
WHERE d.document_id = l.document_id AND
d.last_modified_time <= DATE_SUB(curdate(), INTERVAL 6 MONTH);
另外,我应该提一下,有时候删除数据的动机不是为了节省磁盘空间,而是为了提高性能。在这方面,Orbeon Forms 2016.2有新的索引,可以在您拥有大量数据时大大提高摘要页面和搜索API的性能。