【问题标题】:Mitigate Redshift Locks?减轻 Redshift 锁定?
【发布时间】:2018-08-31 06:57:11
【问题描述】:

您好,我正在通过 Python 运行 ETL。 我有一个简单的 sql 文件,可以从 Python 运行,例如

truncate table foo_stg;
insert into foo_stg
(
 select blah,blah .... from tables 
);

truncate table foo;
insert into foo 
(
select * from foo_stg
);

这个查询有时会锁定它没有释放的表。 由于其他进程排队。

现在我检查哪个表有锁并杀死导致锁的进程。

我想知道我可以对我的代码进行哪些更改来缓解此类问题?

提前致谢!!!

【问题讨论】:

  • 如果锁没有被释放,你在某处缺少commit
  • 我在每笔交易之后都放了一个提交声明
  • 这种情况也发生在 50 次中有 1 次
  • 如果您 100% 确定您始终提交每笔交易,您应该联系亚马逊的支持。
  • 可悲的是我的公司没有 AWS 支持 :(

标签: sql transactions amazon-redshift etl locks


【解决方案1】:

TRUNCATE 可能会破坏您的事务逻辑。建议预先进行所有截断。我还建议添加一些处理逻辑,以确保 ETL 流程的每个实例:A) 对暂存表具有独占访问权限 B) 使用一组单独的暂存表。

TRUNCATE 在 Redshift(和许多其他 DB)中执行隐式 COMMIT

…be aware that TRUNCATE commits the transaction in which it is run.

Redshift 尝试通过返回以下 INFO 消息来确认成功以明确这一点:TRUNCATE TABLE and COMMIT TRANSACTION。但是,SQL 客户端工具可能不会显示此 INFO 消息。运行psql中的SQL即可查看。

【讨论】:

  • 这与 Postgres 有很大的不同,其中 truncate 不进行隐式提交。
  • 所以我这里确实有一个暂存表 foo_stg 是一个暂存表,而 foo 是报告中使用的最终表,因此所有操作都在暂存表中进行,并且数据被移动到最终表中最后插入操作
  • 不确定我应该如何将 truncate 语句替换为其他内容?
  • 您不能在事务中使用截断。因此,您可以:A)首先运行 TRUNCATE 语句,然后在事务中执行其余工作,或 B)在事务中使用 DELETE FROM staging_table; 代替截断。如果您选择选项 B,那么您需要在提交事务后运行 VACUUM DELETE ONLY staging_table;
猜你喜欢
  • 1970-01-01
  • 2017-07-02
  • 2021-06-30
  • 2017-07-29
  • 2020-07-16
  • 1970-01-01
  • 2020-04-07
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多