AWS Redshift:当“ and not true”子句出现时,删除挂起

时间:2019-09-17 09:13:16

标签: sql database amazon-redshift

我在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挂起。

2 个答案:

答案 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>)