如何避免 Postgresql 中每次插入时出现 IO?

Dan*_*kov -1 postgresql database-performance

我正在尝试加快 Postgresq 插入速度。我看到很多文章都在使用 fsync、synchronous_commit 等。我设置了参数以获得最快的写入速度,而且我仍然听到 HDD 每次插入和数据库服务器肯定会执行 IO,就像缓冲区总是满的一样。我错过了什么?

create unlogged table ...;
--  just one insert takes about 400 ms
Run Code Online (Sandbox Code Playgroud)

postgresq 配置

wal_level = minimal                                                        
fsync = off        
synchronous_commit = off                
full_page_writes = off              
wal_compression = off                 
wal_buffers = 128MB                  
wal_writer_delay = 1000ms    
wal_writer_flush_after = 4MB 
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 5

并不是每次都会INSERT导致 I/O,而是每次提交都会导致 I/O。除此之外,检查点执行大部分 I/O(如果shared_buffers足够大)。

以下是加快加载速度的技巧:

  • 增加max_wal_size以减少不必要的检查点

  • 看看那shared_buffers不是太小

  • INSERT在单个事务中使用多个s

  • 使用准备好的语句更快

  • 用来COPY最快

  • COPY (FREEZE)进入在同一事务中创建或截断的表(或分区提示)以加快速度

让你的手指远离fsync,它必须留下来on