如果源中不存在目标表,我正在尝试从目标表中删除记录。我正在使用PDI作为ETL工具。源中大约有 10M 条记录。如果键每天在整个表中查找匹配项,然后在找不到时将其删除,那不是很耗时吗?如何以最有效的方式实现这一目标。
请您详细解释一下,因为我对这个工具很陌生
是的,大量数据需要很长时间。但是,您可以通过利用数据库可以执行的优化来优化该过程。
执行此操作的典型方法是创建具有两个表输入步骤和一个合并 (diff( 步骤的转换。该步骤采用两个输入流,匹配键,然后比较您指定的任何其他字段,向输出流添加一个带有"new"、"已删除"、"changed"或"相同"的标志。对于您的情况,您只关心"已删除"。
如果要检查记录是否存在,则只需要主键/唯一键,而不需要其他字段。这将允许源数据库使用索引,甚至不接触表本身。从目标表中获取记录也是如此,尽管显然您稍后会在那里进行更改。
表输入应选择主/唯一键列并按它们排序。如果源数据库不同并且您有一个非数字键,您可能需要对 Pentaho 中的行进行排序,但我会假设某种整数或 bigint。
将两个流连接到合并 (diff( 步骤。目标表是引用(旧状态(,源表是比较表(新状态(。使用"获取字段"按钮获取关键字段并比较字段。它应该只是您的关键列。
添加筛选器行步骤并按标志字段 ="已删除"进行筛选。添加两个虚拟步骤并将它们连接为真假。现在运行转换并验证指向"true"的行确实存在于目标中,但不再存在于源中。
在对此进行测试并确认它提供了正确的行后,您可能希望使用"删除"步骤来删除目标表记录。如果直接在同一转换中执行此操作,则可能会导致死锁,因为您同时读取和删除目标表。因此,您可以添加"将行复制到结果"步骤,将行传递给父作业。
在父作业中,进行第二次转换。那个只需要两个步骤:从结果中获取行和删除。