【问题标题】:PostgreSQL - ALTER SEQUENCE query never completesPostgreSQL - ALTER SEQUENCE 查询永远不会完成
【发布时间】:2018-09-05 03:49:19
【问题描述】:

我是第一次使用 Postgres,并进行了一些试验。我有一个使用此查询创建的表:

CREATE TABLE test(
id SERIAL,
name int NOT NULL,
PRIMARY KEY (id)
);

我正在尝试使用此查询重置id 列的序列(在清空所有当前数据的表之后):

ALTER SEQUENCE test_id_seq RESTART WITH 1;

但是当我运行这个查询时,它会无限期地运行。我之前运行的所有查询都在几毫秒内完成,但在我杀死它之前已经运行了 3 分钟以上。我应该做些什么不同

【问题讨论】:

  • 您使用的是 10.1 版吗?由于使序列更新成为事务性postgresql-archive.org/…,显然存在一个序列重置非常慢的错误
  • 我使用的是 10.5 版本,我将查看该链接中的解决方案,看看是否能解决问题
  • 通读该线程后,我并不完全清楚应该如何更改查询以解决该问题。我对 SQL 没有非常深入的了解,主要只是设置和管理表。我可以就如何修改原始帖子中的查询获得一些指导吗?
  • 也许它在等待一个锁。你检查了pg_stat_activity(来自不同的会话)
  • 我不认为这是一个锁,因为我仍然能够毫无延迟地运行其他查询,似乎只是这个特定的命令有问题。

标签: postgresql


【解决方案1】:

这很可能是由锁引起的。

查看pg_stat_activity中是否有状态为“idle in transacion”的会话。

使用检查锁

SELECT pid, mode FROM pg_locks WHERE relation = 'test_id_seq'::regclass;

【讨论】:

    【解决方案2】:

    这可能是 Postgres https://www.postgresql-archive.org/Slow-alter-sequence-with-PG10-1-td6002088.html 的错误

    您可以尝试一个 hacky 重置,例如将序列增加一个负数以获得您想要的:
    SELECT * FROM <sequence_name>;

    查看“last_value”列以确定从当前值中减去多少。假设您的序列的 last_value 是 1000:
    ALTER SEQUENCE <sequence_name> INCREMENT BY -999;

    执行减法
    SELECT NEXTVAL('< sequence_name>'); 这应该将序列重置回一个

    将序列重置为其原始增量值:
    ALTER SEQUENCE <sequence_name_> INCREMENT BY 1

    我不在这个版本的 postgres 上,所以我不能为你测试它……但值得一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 2021-06-27
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多