我想从少数几年的表中清除(或加密)电子邮件信息。
我计划将这项工作作为工作的一部分,下次当我运行工作时,如何省略已经擦除或加密的行。
我正在寻找一种性能良好的方法。
答案 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
的表格,其中至少有两列:EncryptionLogger
,EmailTableId
。然后在任何查询中,您只需获取IsEncrypted
的{{1}}行,WHERE
就是Id
此表。