Sql AWS红移:删除挂起,而;而不是真的”;条款出现了

Sql AWS红移:删除挂起,而;而不是真的”;条款出现了,sql,database,amazon-redshift,Sql,Database,Amazon Redshift,我在aws红移上执行了一个删除sql,它已经执行了几个小时,但仍然没有完成 我试着用真空吸尘器将表格百分之百地分类,但没有意义 坏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

我在aws红移上执行了一个删除sql,它已经执行了几个小时,但仍然没有完成

我试着用真空吸尘器将表格百分之百地分类,但没有意义

坏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);
我甚至交换了条件的位置,将
非真
替换为
,不起作用

最后,我发现这个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);
我知道我不需要执行deletesql,因为条件总是false,它不会删除任何内容。我只想知道什么会导致sql挂起。

您可以这样形成

delete from my_table
where id in (
    select id from tmp_table
    )
当SQL在任何数据库上“挂起”时,99%的时间挂起是因为其他进程锁定了对象

在您的例子中,由于您正在进行实验,您可能多次运行相同的语句,并且您试图从中删除的表有一个锁

为了在红移中列出锁,可以使用此查询

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();
选择
当前时间,
c、 雷尔纳姆,
l、 数据库,
l、 交易,
l、 pid,
a、 usename,
l、 模式,
l、 同意
来自pg_locks l
在c.oid=l关系上连接pg_catalog.pg_c类
在a.procpid=l.pid上加入pg_catalog.pg_stat_活动a
其中l.pid pg_backend_pid();
当您确定哪个进程锁定了表,并确保可以终止它后,您可以这样做以消除瓶颈

select pg_cancel_backend(<pid of the process from above query>)
选择pg\u cancel\u backend()

删除了多少行?删除可能非常昂贵,尤其是在柱状数据库中。通常,在红移时进行删除的更好方法是选择您确实需要的行到新表中,删除或重命名原始表,然后使用原始名称重命名新表,即替换它。别忘了,一旦你在红移上做了大量的删除,你也需要清空表。在这种情况下,根据你要删除的数据量,创建一个新表可能会更快,我在回答这个问题时已经解释了如何
select pg_cancel_backend(<pid of the process from above query>)