由于 Amazon Redshift 针对读取而不是写入进行了优化,我如何使用 ETL 工具(在我的情况下为 Pentaho 数据集成)管理渐变维度过程?
由于 ETL 工具会逐行进行更新/插入(维度查找/更新),因此性能会非常低。
有没有人已经经历过这个问题?
由于 Amazon Redshift 针对读取而不是写入进行了优化,我如何使用 ETL 工具(在我的情况下为 Pentaho 数据集成)管理渐变维度过程?
由于 ETL 工具会逐行进行更新/插入(维度查找/更新),因此性能会非常低。
有没有人已经经历过这个问题?
Redshift 中的更新很慢,因为更新是在事务中执行的一系列操作:
所有这些都必须跨节点协调。
更新单行可能需要更新 1000 行。更糟糕的是,由于更新时间过长并且需要写锁,它们会长时间阻塞查询,从而显着影响整体系统性能。
有 3 种方法可以让它更快(全部来自经验):
避免更新。
如果您有一个条件可以让您区分新行和旧行,只需将新行附加到表中,并使用该条件修改您的查询。您会惊讶地发现 Redshift 的执行速度更快 - 即使每个查询可能变得有点复杂,因为没有更新会导致系统过载,这些查询可能会运行得更快(确保 dist 键是正确的)。
例如,每个业务密钥的最大时间戳条件运行得非常快(特别是如果您的业务密钥是您的 dist 密钥 - 这一切都将并行运行)。
这是优选的解决方案。
批量执行更新。
如果您的更新适用于一系列行,请使用 where 条件一次更新它们。尽管您的里程可能会有所不同,但 1000 批次的效果很好。
创建一个存储“新”行的表,然后在该表至少有 1000 行大后使用连接进行更新。