AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 174659
Accepted
brauliobo
brauliobo
Asked: 2017-05-27 03:06:21 +0800 CST2017-05-27 03:06:21 +0800 CST 2017-05-27 03:06:21 +0800 CST

没有表锁的 CLUSTER 替代方案

  • 772

由于频繁的新记录和更新记录导致索引和存储碎片,我正面临性能下降和存储使用量增加的问题。

VACUUM 没有多大帮助。

不幸的是,CLUSTER 不是一个选项,因为它会导致停机并且 pg_repack 不适用于 AWS RDS。

我正在寻找 CLUSTER 的 hacky 替代品。在我的本地测试中似乎运行良好的一个是:

begin;

create temp table tmp_target as select * from target;

delete from target;
insert into target select * from tmp_target order by field1 asc, field2 desc;

drop table tmp_target;

commit;

ctid看起来正确的顺序是:

select ctid, field1, field2 from target order by ctid;

问题是:这看起来不错吗?它是否会为导致应用程序停机的查询锁定target表?SELECT有没有办法列出事务中涉及的锁?

与集群命令锁定副本上的只读查询相关

postgresql locking
  • 2 2 个回答
  • 1429 Views

2 个回答

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2017-05-27T05:06:54+08:002017-05-27T05:06:54+08:00

    如果它只是关于表格膨胀,VACUUM FULL那么工具就是这样做的。(VACUUM如果它可以在末尾机会性地截断物理文件,则只收缩物理文件。)但是,VACUUM FULL也对表进行独占锁定,就像CLUSTER.

    在没有独占锁的情况下做同样的事情pg_repack是您正在寻找的工具。不幸的是,亚马逊似乎不允许这样做。

    • VACUUM 将磁盘空间返回给操作系统

    手动解决方案引入了各种极端情况和竞争条件。在我们讨论最佳解决方案之前,您需要准确指定您的表和可能的访问模式。

    无论哪种方式,您当前的解决方案都不好。您在删除所有行(锁定它们)后进行排序操作,这不会缩短查询的停机时间(锁定持续时间)SELECT。

    如果您没有并发写访问权限并且没有依赖对象,这可能会更好:

    BEGIN;
    
    CREATE TEMP TABLE tmp_target AS TABLE target ORDER BY field1, field2 DESC;
    
    TRUNCATE target;
    INSERT INTO target TABLE tmp_target;
    
    -- DROP TABLE tmp_target;  -- optional; dropped at end of session automatically
    
    COMMIT;
    
    1. 在拿锁之前在后台排序。
      严格来说,INSERTwithoutORDER BY可以自由地以任何物理顺序写入行。但是,实际上,它会使用普通SELECT * FROM(或TABLE简称)复制临时表的当前物理顺序。

    2. 使用TRUNCATEinstead of DELETE,这对于大表来说更快。请注意某些含义,例如TRUNCATE不适用于 FK 约束。阅读手册以了解全部内容。

    您可能希望在之前删除现有索引TRUNCATE并在之后重新创建INSERT以加快速度。

    有关的:

    • 在大表中填充新列的最佳方法?
    • 为什么 VACUUM ANALYZE 不清除所有死元组?
    • 配置 PostgreSQL 以提高读取性能
    • 5
  2. timetofly
    2018-12-18T14:40:45+08:002018-12-18T14:40:45+08:00

    pg_repack现在在 RDS上可用。

    • 2

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve