面试题答案
一键面试work_mem
- 影响:
work_mem
用于设置在排序(如ORDER BY
、DISTINCT
操作)和哈希表构建(如JOIN
操作)时每个工作线程可用的内存量。如果复杂查询包含排序或哈希操作,而work_mem
设置过小,会导致这些操作无法在内存中完成,需频繁写入临时磁盘文件,从而大幅增加查询执行时间。 - 调整:分析查询执行计划,若发现有排序或哈希操作因内存不足而写入磁盘,可适当增加
work_mem
值。但注意不能设置过大,因为每个并发查询的每个工作线程都会分配work_mem
大小的内存,过大可能导致系统内存耗尽。通常先以较小幅度(如原大小的1.5倍)增加,然后重新测试查询性能,根据结果继续调整。
maintenance_work_mem
- 影响:
maintenance_work_mem
主要用于维护操作,如VACUUM
、CREATE INDEX
等。它对普通查询执行本身没有直接影响,但如果复杂查询执行前相关表没有经过合适的维护(例如未及时VACUUM
导致表膨胀、索引统计信息陈旧等),可能间接影响查询性能。若maintenance_work_mem
设置过小,维护操作执行缓慢,会延迟查询优化所需信息的更新。 - 调整:如果查询性能问题是由于表或索引维护不当造成的,在执行维护操作(如
VACUUM
)时可临时增加maintenance_work_mem
。一般根据系统可用内存和维护操作规模来调整,如对于大表的VACUUM FULL
操作,可将其设置为系统内存的1/4到1/2 ,操作完成后恢复默认值。
effective_cache_size
- 影响:
effective_cache_size
向查询规划器提供关于操作系统文件系统缓存和共享缓冲区(PostgreSQL 缓存数据页的内存区域)可用于缓存数据库页的内存总量估计值。规划器使用这个值来估计是否可以将表和索引数据保留在内存中,从而影响查询计划的选择(例如决定是否使用顺序扫描还是索引扫描)。如果估计值设置不准确,规划器可能选择次优的查询计划,导致查询执行缓慢。 - 调整:根据实际系统的内存使用情况调整
effective_cache_size
。可通过监控系统内存使用(如使用free
命令查看系统空闲内存、已用内存等信息),以及数据库缓存命中率(例如通过pg_stat_activity
视图分析查询是否频繁读取磁盘数据)来判断。如果发现查询频繁读取磁盘,且系统内存有足够空间,可适当增加effective_cache_size
,一般先增加10% - 20%,重新分析查询计划并测试查询性能,逐步找到最优值。