由于表

时间:2016-09-30 20:48:08

标签: orbeon

我们的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应用程序本身可能出现的副作用。

1 个答案:

答案 0 :(得分:0)

我发现有两个问题:

  1. 最重要的是,在某些情况下,这会删除太多数据,因为orbeon_form_data有点像日记,其中添加了新行,但“从不”更新或删除。比如,一个新的表单实例(文档ID)是在1年前创建的,并且今天刚刚更新:您将有2行具有相同的document_id但不同的last_modified_time,并且您的查询将被删除本文档是因为其中一个人的last_modified_time年龄超过6个月。
  2. 可以更新上述查询以避免第1点中提到的问题,但它可能比需要的更具侵略性。
  3. 所以,我建议:

    1. 您可以从文档的Purging Old Data部分开始查询,这些查询更加保守。第一个删除 x 月以前的已删除的数据,第二个删除不再引用的附件。从这些开始,看看这是否会将数据量降低到对您来说更合理的数据。
    2. 如果这不能删除足够的数据,请在上面的查询中尝试通过以下查询替换( … ) 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);
      
    3. 另外,我应该提一下,有时候删除数据的动机不是为了节省磁盘空间,而是为了提高性能。在这方面,Orbeon Forms 2016.2有新的索引,可以在您拥有大量数据时大大提高摘要页面和搜索API的性能。