如果您要启动应用程序,请在选择多租户数据库之前先考虑一下。如果您选择这是您的选择
如果您已经有多年的多年申请在多租户模型上工作了,并且该从以前的旧链接中删除数据,请知道此过程可能很耗时且复杂。
简短的历史
第一次删除旧客户记录的尝试是使用Django的ORM使用Python脚本。由于ORM的开销,该解决方案非常慢。我们发现,这种尝试将需要很长时间,因为每天进入系统的记录比我们所能删除的更多。
。第二次尝试是使用PL/SQL执行CIE种姓。该脚本是Pillful领域的,并且在Internet上有徒劳的例子。但是,此脚本并非有效地制作大量数据,因为他必须每次删除记录(能够找到叶子记录),而必须通过注册删除注册。我们发现,这种尝试将需要50年才能完成。
Soluã§o
我们发现解决此问题的解决方案也是使用PL/SQL,猪肉,而不是与将要删除的每个记录建立关系,我们拥有所有需要淡入的记录的缓存,然后我们会在基于缓存的地段中出去。只要没有创建新记录就取决于将要删除的记录,这将起作用。
由于有很多表,我们选择继续进行数据驱动的解决方案。这意味着使用所有需要删除的表创建一个控制表。因此,PL/SQL脚本使用此表来控制缓存顺序和删除顺序,并且还可以知道每个表中的哪个状态。数据结构
第一个挑战是正确组装该控制表。最初,我们认为我们只需要映射表并标记它们之间的关系。
更深入地分析问题,很明显,同一表可能不止一次出现,因为它可能不止一次。因此,我们真正需要在此控制表中建立联系的是外国关键的禁忌症,以及该表中的各个信息的信息。
。尽管控制表是正式的表,因为将外键与外键与母亲的列相关联的列,但我们实际上是在设置“â°”结构。这并不是两个原因:a)我们可能具有循环依赖性; b)我们可能有重复的分支。
无法解决循环依赖性问题,因此有必要检测何时发生和忽略圆形依赖性。这些情况通过更新手动校正,以删除可能导致循环依赖的参考。
重复分支的问题不会损害删除的执行。之所以发生,是因为我们实际上是一个dag。算法
为了评分数据,我们必须从“”“”“离开”方向的“根”开始。这是必要的,因为我们将使用母表查找女儿表的记录。
要执行删除,必须反向订单。我们必须从叶子开始,然后扎根。这是必要的,因为如果我们在孩子们面前删除父母,我们将遇到外国密钥约束错误。为了避免其他问题,这完全是要创建一列,说“”中的“高度”是什么。
考虑因素
要在生产环境中开发和监视脚本执行,创建日志非常重要。当我们在数据库中时,日志是在表中创建的。
由于脚本在黎明时每天都会运行,因此有必要创建一个受控的执行窗口。例如,它没有执行缓存表中所有记录的删除,而仅限于在一定间隔中的记录,然后将此间隔卷积。
出勤率:这种卷积的综合被称为Watemark,应非常谨慎使用。它仅在旧的记录中运行(这是脚本的目的),因为最近的记录可能仍保存在数据库中,但已经消耗了该序列。 由于脚本会删除产生数据,因此也有必要执行备份系统。由于我们已经有一个缓存来加速过程,因此我们修改了缓存本身以将所有列存储在表中。
,还必须创建一个回滚脚本,这应该撤消删除脚本所做的。
结果
有了第一个规划所有必须排除的内容的算法,然后最终进行排除,我们可以将执行时间从50年下载到80天,将40亿张记录排除在更多100张表中。 PL/SQL算法的开发时间和测试为5个月。