您好,我正在通过 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
);
这个查询有时会锁定它不释放的表。 由于其他进程排队。
现在我检查哪个表有锁并终止导致锁的进程。
我想知道我可以在我的代码中做哪些更改来缓解此类问题?
提前致谢!!!
TRUNCATE
可能会破坏您的交易逻辑。建议预先进行所有截断。我还建议添加一些处理逻辑,以确保 ETL 过程的每个实例:A)具有对暂存表的独占访问权或B)使用一组单独的暂存表。
TRUNCATE
在 Redshift(和许多其他数据库)中做一个隐式的 COMMIT
。
Redshift 试图通过返回以下 INFO 消息以确认成功来明确这一点:
TRUNCATE TABLE and COMMIT TRANSACTION
。但是,SQL 客户端工具可能不会显示此 INFO 消息。运行psql
中的SQL就可以看到了
在我的例子中,我第一次创建了一个表,并尝试使用 insert into a table from select c1,c2,c3 from stage 从阶段表加载它;我正在使用 python 脚本运行它。 该表正在锁定并且未加载数据。另一个有趣的场景是当我从编辑器运行相同的插入 SQL 时,它正在加载,然后我的 python 脚本加载同一个表而没有任何锁。但是第一次只有表锁发生。不确定是什么问题。