我们在 生产环境 服务器中使用PostgreSQL 9.1 . 从过去一个月开始,我们的数据库每天生成近35 GB的存档日志 . 为此,我们监控了存档日志生成时正在运行的所有查询 . 然后我们在整个数据库上运行真空(冻结,分析) . 但它似乎对归档日志生成没有影响 . 我们怀疑有一张 table . 每隔9小时和第39分钟,正在运行相同的删除语句 . 它每次执行时都会删除整个表 . 出于测试目的,我们对语句运行了EXPLAIN(ANALYZE,BUFFERS) . 我们发现read = 576 MB,写入= 328 MB . 但是,在我们的 生产环境 服务器中,shared_buffers = 24 MB . 因此,每次从磁盘到共享缓冲区需要24 MB的数据块 . 然后它将刷新到磁盘,并再次将24 MB的数据块放入共享缓冲区 .
那么,归档日志生成的原因是因为频繁刷新数据块吗?我们是否需要在 生产环境 服务器中增加shared_buffers以摆脱繁重的归档日志生成?在我们的 生产环境 服务器中,work_mem = 1 MB以下是EXPLAIN(ANALYZE,BUFFERS)的输出,供您参考:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
Delete on table_a (cost=83.35..171.85 rows=2060 width=12) (actual time=11949.929..11949.929 rows=0 loops=1)
Buffers: shared hit=375963 read=73999 written=42030
-> Hash Semi Join (cost=83.35..171.85 rows=2060 width=12) (actual time=1.028..12.570 rows=2060 loops=1)
Hash Cond: (public.table_a.id = public.table_a.id)
Buffers: shared hit=46 read=30 written=18
-> Seq Scan on table_a (cost=0.00..57.60 rows=2060 width=10) (actual time=0.007..5.009 rows=2060 loops=1)
Buffers: shared hit=7 read=30 written=18
-> Hash (cost=57.60..57.60 rows=2060 width=10) (actual time=0.973..0.973 rows=2060 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 89kB
Buffers: shared hit=37
-> Seq Scan on table_a (cost=0.00..57.60 rows=2060 width=10) (actual time=0.002..0.463 rows=2060 loops=1)
Buffers: shared hit=37
Total runtime: 11950.028 ms
1 回答
https://www.postgresql.org/docs/9.1/static/wal-intro.html
所以总之
INSERT, UPDATE, DELETE, VACUUM, CLUSTER, ALTER.. SET TABLESPACE
(和其他类似的)产生WALs . 随着更多WAL被创建,更多的块被重写 .shared_buffers
不会影响它 .