我在aws-redshift上执行了一个删除SQL,它已经执行了几个小时,但仍未完成。
我试图将表VACUUM
进行100%排序,但这没有意义。
错误的sql是:
delete from tmp_table
using my_table
where (my_table.id = tmp_table.id)
and (not true);
我交换了这两个表,它仍然挂着。
delete from my_table
using tmp_table
where (my_table.id = tmp_table.id)
and (not true);
我什至交换了条件的位置,并用not true
代替了false
,没有用。
最后,我发现此sql也挂起了
delete from tmp_table using my_table where false;
我执行了其他一些sql,它们运行得非常快:
select count(*) from tmp_table
join my_table
on (my_table.id = tmp_table.id)
and (not true);
delete from my_table
using tmp_table
where (my_table.id = tmp_table.id)
and (true);
我知道我不需要执行delete sql,因为条件始终为false,并且不删除任何内容。我只想知道是什么原因导致sql挂起。
答案 0 :(得分:0)
您可以像这样
delete from my_table
where id in (
select id from tmp_table
)
答案 1 :(得分:0)
当SQL在任何数据库上“挂起”时,由于某种其他原因,它有99%的时间在对象上锁定。
在您的情况下,由于您正在试验,因此您可能多次运行了相同的语句,而试图从中删除的表具有锁。
要列出Redshift中的锁,您可以使用此查询
SELECT
current_time,
c.relname,
l.database,
l.transaction,
l.pid,
a.usename,
l.mode,
l.granted
FROM pg_locks l
JOIN pg_catalog.pg_class c ON c.oid = l.relation
JOIN pg_catalog.pg_stat_activity a ON a.procpid = l.pid
WHERE l.pid <> pg_backend_pid();
当您确定哪个进程锁定了表并确保可以杀死它之后,可以这样做来消除瓶颈。
select pg_cancel_backend(<pid of the process from above query>)