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