跟踪已更新或加密的行

时间:2017-09-13 07:03:28

标签: oracle performance bulk-operations

我想从少数几年的表中清除(或加密)电子邮件信息。

我计划将这项工作作为工作的一部分,下次当我运行工作时,如何省略已经擦除或加密的行。

我正在寻找一种性能良好的方法。

2 个答案:

答案 0 :(得分:2)

  

"我想从几张超过几年的表格中删除(或加密)电子邮件信息"

我希望这意味着您在这些表上有一个日期列,您可以使用它来确定哪些需要清除。解决这项工作的最有效方法是在操作表中跟踪该日期,记录最近清除的日期。

例如,你有十年的时间'值得的数据,你需要擦洗超过四年的记录。现在这可行:

  update t23
  set email = null
   where date_created < add_months(sysdate, -48);

但似乎你想要批量处理。因此,建立一个跟踪表,最简单的就是

create table tracker (
    last_date_scrubbed);

使用一个非常古老的日期last_date_scrubbed

填充date '2010-01-01'

现在你可以写一个这样的查询

update t23
  set email = null
   where date_created 
     < (select last_date_scrubbed + interval '1' year from tracker);

这将清除所有早于2011年的记录。将跟踪器表中的日期增加一年。再次运行查询以清除2011年的内容。重复直到达到目标清洁状态。此时,您可以切换为每月运行查询,interval为一个月,或者其他任何内容。

显然你应该对此进行程序化。过程是封装步骤的最佳方法,并确保一切都保持在步骤中。您也可以使用数据库调度程序来运行该过程。

  

&#34;这种方法有一个缺点。我认为您希望在选择要更新的行时自由。&#34;

我没有看到跟踪哪些行被清除的要求。毕竟,最终状态是每个早于某个日期的记录都已被清除。当我以前做过这样的工作时,任何人都想知道的是,&#34;到目前为止我们做了多少行,还有多少行还要做?&#34;可以通过跟踪每次运行的sql%rowcount来解答。

答案 1 :(得分:1)

为获得最佳性能,您可以在主表中添加标志列。像<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body> <div class="myDiv"> </div> </body>这样的列。每次你尝试运行任何查询&#34;而不是加密的行&#34;当IsEncrypted列为false时,您可以轻松使用WHERE来仅限这些行。
还有其他方法。

编辑
另一种方法是创建一个记录器表。基本上这个表的作用是,它记录了你想要的另一个表中某个ID的更多信息。还有另一个名为IsEncrypted的表格,其中至少有两列:EncryptionLoggerEmailTableId。然后在任何查询中,您只需获取IsEncrypted的{​​{1}}行,WHERE就是Id此表。