Amazon web services 红移删除或截断表非常慢

Amazon web services 红移删除或截断表非常慢,amazon-web-services,amazon-redshift,Amazon Web Services,Amazon Redshift,在我的红移数据库中删除或截断一个不太大的表(4M行)时,需要很长时间(数小时)才能完成。有人经历过同样的问题吗 谢谢,我也遇到过同样的问题。 原来是从别处打开的 例如,如果使用红移shell打开了两个shell,则无法从第一个shell中删除参与第二个shell中打开的事务的表 在第二个窗口中提交/回滚后,truncate工作得非常好 希望有帮助。红移具有非常快的I/O,因此对于任何类型或大小的集群,操作都应该不到1秒。 正如diemacht所说,这个问题是因为您与一个开放事务有另一个连接 我有

在我的红移数据库中删除或截断一个不太大的表(4M行)时,需要很长时间(数小时)才能完成。有人经历过同样的问题吗


谢谢,我也遇到过同样的问题。 原来是从别处打开的

例如,如果使用红移shell打开了两个shell,则无法从第一个shell中删除参与第二个shell中打开的事务的表

在第二个窗口中提交/回滚后,truncate工作得非常好


希望有帮助。

红移具有非常快的I/O,因此对于任何类型或大小的集群,操作都应该不到1秒。 正如diemacht所说,这个问题是因为您与一个开放事务有另一个连接

我有一个类似的问题:客户机崩溃导致交易“打开”,但无法检查。 STV_locks表上未出现db锁:(使用
从STV_locks中选择表id、上次更新、锁所有者、锁所有者pid;

此外,没有查询仍在运行:(选中:
select pid,trim(用户名),starttime,query,substring(query,1,20),status='running'所在的stv\u recents的状态;

因此,解决方案是列出用户会话:
SELECT*fromstv\u sessions

然后使用:
选择pg\u terminate\u backend(pid)

或者是杀光所有人的版本:

SELECT pg_terminate_backend(process) FROM STV_SESSIONS where user_name='user_name' and process != pg_backend_pid();

请注意,
CANCEL{pid}
不起作用!(查询已取消,但事务仍处于打开和锁定状态)。

根据我的经验,正如@Gerardo Grignoli所说,锁不会显示在
stv\u locks
表中,但它们会显示在
pg\u locks
中。根据您的环境,杀死
stv_sessions
中列出的任意长时间运行的会话可能是不可接受的。我发现
pg_locks
表对于检测此类锁非常可靠:

select * from pg_locks where relation = (select oid from pg_class where relname = 'the_table')
select pg_cancel_backend(pid)

通常,问题是导致表死锁的
ACCESS EXCLUSIVE
锁。因此,如果列出了多个锁,则查找并杀死
访问独占锁。

表上的IMO AccessShareLock也会导致DDL命令卡住

运行此查询以计算AccessShareLock的PID

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();
使用
选择pg_terminate_backend()终止进程


确保所有只读应用程序关闭并释放所有连接,从而释放这些锁

您可以提供一些其他信息,如表宽度、群集设置等吗?如果Gerardo的回答解决了您的问题,您应该接受它。
从STV_会话中选择pg_terminate_后端(进程),其中user_name='user_name'和process!=pg_backend_pid()现在不工作。它返回
INFO:Function“pg\u terminate\u backend(integer)”不受支持。
消息。@masashimiyazaki,
pg\u terminate\u backend
在从红移表中选择时不起作用。另一条消息表明该函数在红移表上不可用。获取PID列表并分别对每个PID应用pg_terminate_backend()。也许自从父post之后,这种行为发生了变化。难道不能在WLM中为用户查询添加一个超时吗?对我来说,也是AccessShareLock造成了这个问题。