是否可以配置 PostgreSQL,使偶尔的大量更新可以 运行 超快?
Can PostgreSQL be configured so that occasional mass updates can run super-fast?
我已经设置了一个 PostgreSQL 测试环境,它需要包含与生产数据库相同数量的数据(行数),并且配置大部分类似于生产以模拟正常事务的相同性能。
但是,它是一个测试环境,有时必须应用一些独特的、实验性的、临时的或临时的更改。比如在性能测试前添加或删除一些索引,重新计算某列的值以复制测试条件,转储并重新导入整个表等
有没有办法暂时中止数据完整性保证,以便尽快执行此类大规模更新?
例如,在MySQL中,您可以设置超大写缓冲区、禁用事务日志记录以及在事务提交时暂停磁盘刷新。 pgsql中有类似的东西吗?
部署环境为AWS EC2
您可以使用 ALTER TABLE ... SET UNLOGGED
禁用 WAL 日志记录,但请注意反向操作会将整个 table 转储到 WAL。
如果这不可行,您可以通过设置 max_wal_size
hugh 来提高性能,从而获得更少的检查点。
通过设置 fsync = off
.
禁用 WAL 刷新
请注意,第一个和第三个措施会在发生崩溃时破坏您的数据库。
The manual 有一章专门介绍数据库的初始加载。
您可以更改一些安全选项以加快速度:
- 增加max_wal_size
- 增加checkpoint_timeout
- wal_level 到
minimal
- wal_log_hints 到
off
- synchronous_commit 到
off
还有一些相当不安全的选项可以让事情变得更快。不安全的含义:如果服务器崩溃,您可能会丢失所有数据 - 因此使用风险自负!
- full_page_writes 到
off
- fsync 到
off
再次说明:通过更改上述两个设置,您可能会 丢失所有数据 。
要禁用 WAL,您还可以将所有表设置为 unlogged
我已经设置了一个 PostgreSQL 测试环境,它需要包含与生产数据库相同数量的数据(行数),并且配置大部分类似于生产以模拟正常事务的相同性能。
但是,它是一个测试环境,有时必须应用一些独特的、实验性的、临时的或临时的更改。比如在性能测试前添加或删除一些索引,重新计算某列的值以复制测试条件,转储并重新导入整个表等
有没有办法暂时中止数据完整性保证,以便尽快执行此类大规模更新?
例如,在MySQL中,您可以设置超大写缓冲区、禁用事务日志记录以及在事务提交时暂停磁盘刷新。 pgsql中有类似的东西吗?
部署环境为AWS EC2
您可以使用 ALTER TABLE ... SET UNLOGGED
禁用 WAL 日志记录,但请注意反向操作会将整个 table 转储到 WAL。
如果这不可行,您可以通过设置 max_wal_size
hugh 来提高性能,从而获得更少的检查点。
通过设置 fsync = off
.
请注意,第一个和第三个措施会在发生崩溃时破坏您的数据库。
The manual 有一章专门介绍数据库的初始加载。
您可以更改一些安全选项以加快速度:
- 增加max_wal_size
- 增加checkpoint_timeout
- wal_level 到
minimal
- wal_log_hints 到
off
- synchronous_commit 到
off
还有一些相当不安全的选项可以让事情变得更快。不安全的含义:如果服务器崩溃,您可能会丢失所有数据 - 因此使用风险自负!
- full_page_writes 到
off
- fsync 到
off
再次说明:通过更改上述两个设置,您可能会 丢失所有数据 。
要禁用 WAL,您还可以将所有表设置为 unlogged