使用常量读取请求更新大表

时间:2016-10-02 14:45:00

标签: sql postgresql

我需要更新一个有大量来自客户端的读取请求的大表(100k行)。

我需要遍历表格的每一行并检查数据是否过时。如果该行已过时,则使用新数据覆盖,否则忽略并转到下一行。

我现在可以想到两种策略。

  1. 使用UPDATE - s创建一个逐行(或一批行)遍历表的后台进程。不会锁定整个表格,但速度很慢。

  2. 根据新数据创建新表。锁定旧桌子片刻。删除旧表。将新表重命名为旧表。

  3. 本质:

    CREATE TABLE fresh;
    LOCK TABLE old IN EXCLUSIVE MODE;
    DROP TABLE old;
    ALTER TABLE fresh RENAME TO old;
    

    我应该怎么做?第二种策略是否有效并且是线程安全的吗?

2 个答案:

答案 0 :(得分:1)

您可以创建一个表的视图并在sql查询中使用该视图。当您创建一个新表并填充数据时,您只需重新创建一个包含新表的视图。

答案 1 :(得分:1)

只要更新会话是表中唯一的编写者,第二种方法就是安全的。

我想说在这种情况下这是更好的方法。我认为优点是:

  • 如果出现问题,可以轻松回滚更新(只需删除表格副本)。

  • 因此,如果更新中断,您不必花时间考虑重启方案。

  • 没有表格臃肿。

缺点是您可能需要更多空间。