【问题标题】:PostgreSQL OFFSET field consistency across processesPostgreSQL OFFSET 跨进程字段一致性
【发布时间】:2014-12-18 14:42:52
【问题描述】:

我正在尝试将 Postgres table1 复制到另一个 table2,同时更改其中一列的值。为了加快传输速度,我运行了 10 个不同的进程,每个进程在 table1 中都有不同的偏移量,例如,1st process:SELECT * FROM table OFFSET offset1 LIMIT x; 然后复制到table2,2nd process:SELECT * FROM table OFFSET offset2 LIMIT x 然后复制到table2 .

但即使我的table1 中没有重复行,我的table2 中确实有重复行(x 小于offset2-offset1)。是否有可能相同的offset 值没有指向跨不同进程的表中的同一行?如果是,那么在修改 Postgres 中的列时复制表的更好方法是什么?谢谢!

【问题讨论】:

  • 近乎重复:PostgreSQL - repeating rows from LIMIT OFFSET。另一个问题的提问者使用order by,但使用的是非唯一表达式。顺便说一句,这在丹尼斯的回答中是缺失的。仅使用ORDER BY 是不够的,它需要应用于一个字段或字段组合或在所有行中唯一的表达式。
  • 另外,你应该计时CREATE TABLE table2 AS SELECT...,如果这些会话相互竞争以获得对磁盘的访问权限,它可能比 10 个不同的进程更快,除非你的 postgres 数据分区分布在一个大的物理驱动器的数量

标签: postgresql


【解决方案1】:

如果没有order by 语句,limit 和offset 很少有意义... SQL 不能保证行顺序,除非您明确说明。所以添加一个order by 子句。

另外,如果您想要批发复制表,最好简单地:

insert into table2 select * from table1

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2023-03-03
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多