我喜欢PostgreSQL的抗崩溃能力,因为我不想花fixing a database分钟.然而,我确信一定有一些东西我可以禁用/修改,这样即使在停电/崩溃之前,插入/更新也能更快地工作.我不担心几条记录,只担心整个数据库.

我正在try 针对大量写入优化PostgreSQL.目前插入100万行需要22分钟,这似乎有点慢.

How can I speed up PostgreSQL writes?

我研究过的一些选项(如FULL_PAGE_WRITS)似乎也有损坏数据的风险,而这不是我想要的.我不介意丢失数据-我只是不想损坏.

更新1

这是我正在使用的表——这是因为大多数表都包含int和小字符串.这个"示例"表似乎是我所期望的最好的例子.

CREATE TABLE "user"
(
  id serial NOT NULL,
  username character varying(40),
  email character varying(70),
  website character varying(100),
  created integer,
  CONSTRAINT user_pkey PRIMARY KEY (id)
)
WITH ( OIDS=FALSE );
CREATE INDEX id ON "user" USING btree (id);

我有大约10个脚本,每个脚本使用准备好的语句一次发出100000个请求.这是为了模拟我的应用程序将为数据库提供的真实负载.在我的应用程序中,每个页面都有1+个插入.

更新2

我已经在使用异步提交了,因为我已经

同步提交=关闭

在主配置文件中.

推荐答案

在22分钟内插入1M条记录相当于758条记录/秒.这里的每个插入都是对磁盘的单独提交,最终包含预写日志(log)和数据库组件.正常情况下,我预计即使是配备电池后备高速缓存的好硬件,您也会幸运地达到每秒3000次提交.因此,如果这是没有这种写入加速的常规硬件,那么您实际上做得还不算太差.在您所处的情况下,这里的正常限制是在500到1000个提交/秒的范围内,而不需要针对此情况进行特殊调整.

至于这会是什么样子,如果您不能使每个提交都包含更多记录,那么您可以 Select 以下加速方法:

  • 关闭同步提交(已关闭)

  • 增加wal_writer_延迟.什么时候

  • 将wal_缓冲区增加到16MB,只需

  • 增加CHECKPOINT_SEGMENTS,以进行剪切 向下看常规数据的频率 已写入磁盘.你可能想要 这里至少有64人.缺点是更高的磁盘空间使用率和更长的恢复时间 在一次撞车之后.

  • Increase shared_buffers. The default here is tiny, typically 32MB. You have to increase how much UNIX shared memory the system has to allocate. Once that's done, useful values are typically >1/4 of total RAM, up to 8GB. The rate of gain here falls off above 256MB, the increase from the default to there can be really helpful though.

差不多就是这样.您接触到的任何其他可能会有帮助的内容都可能导致崩溃中的数据损坏;这些都是完全安全的.

Database相关问答推荐

在GridDB中使用存储过程失败

Pocketbase 中的 SQLite 数据库可以根据自己的喜好进行修改吗?

使用 prisma ORM 在我的迁移中手动添加触发器

使用 golan 查询 mongodb 中的集合并返回 id 作为字符串

如何在 Big Data 中进行模糊搜索

您如何使两个相关但独立的系统保持同步?

将光标中找到的值输出到logcat?

WAMP 的 MySQL 数据库文件位于何处?

Java中基于文件的数据库

Entity Framework:如何检测对数据库的外部更改

MySQL JDBC Driver中cachePrepStmts和useServerPrepStmts有什么区别

在 MySQL 中实现一对一关系时确定外键

NameError:设置更改为 mysql 后未定义名称_mysql

如何决定使用什么 [Sqlite、Realm、CoreData、User-default、JSON 文件] 来存储 iOS 数据?

什么是表前缀?

PostgreSQL 字符变长限制

如果数据库已经提供缓存,为什么还要使用应用程序级缓存?

Python中准备好的语句和参数化查询之间的混淆

以可能的数据丢失为代价提高 PostgreSQL 写入速度?

Web 应用程序的文件存储:文件系统、数据库和 NoSQL 引擎