In PostgreSQL, work_mem
and shared_buffers
are two important configuration parameters that control memory usage, but they serve different purposes. Here’s a breakdown of their differences:
1. Purpose
work_mem
:- Controls the amount of memory used for per-operation sorting and hashing (e.g.,
ORDER BY
,DISTINCT
,GROUP BY
, and joins). - It is allocated per operation per session, meaning multiple operations in a single query can each use up to
work_mem
of memory. - If the operation requires more memory than
work_mem
, PostgreSQL will spill to disk (e.g., use temporary files), which can slow down performance.
- Controls the amount of memory used for per-operation sorting and hashing (e.g.,
shared_buffers
:- Controls the amount of memory used for caching data pages in shared memory.
- It is a global memory pool shared across all sessions and is used to cache frequently accessed data from disk.
- A larger
shared_buffers
setting can reduce the need to read data from disk, improving performance.
2. Scope
work_mem
:- Per-operation and per-session: Each operation (e.g., sort, hash) in a query can use up to
work_mem
of memory. If a query has multiple operations, each can allocate its ownwork_mem
.
- Per-operation and per-session: Each operation (e.g., sort, hash) in a query can use up to
shared_buffers
:- Global: Shared across all sessions and processes. It is used to cache data pages for all queries and operations.
3. Impact on Performance
work_mem
:- Increasing
work_mem
can improve the performance of queries that involve sorting, hashing, or joining large datasets, as it reduces the need to spill to disk. - However, setting it too high can lead to excessive memory usage, especially if there are many concurrent sessions or complex queries.
- Increasing
shared_buffers
:- Increasing
shared_buffers
can improve performance by reducing disk I/O, as more data can be cached in memory. - However, setting it too high can leave less memory for other parts of the system (e.g., the operating system’s disk cache).
- Increasing
4. Default Values
work_mem
:- Default is typically 4MB.
- Can be adjusted dynamically per session or query.
shared_buffers
:- Default is typically 128MB.
- Requires a PostgreSQL restart to change.
5. When to Adjust
work_mem
:- Increase if you notice disk spills (e.g., temporary files being written during sorts or joins).
- Monitor memory usage to avoid over-allocating.
shared_buffers
:- Increase if your workload involves frequent reads of the same data (e.g., OLTP workloads).
- Typically set to 25-40% of total system memory for dedicated PostgreSQL servers.
6. Example Scenarios
work_mem
:- A query with a large
ORDER BY
clause might perform slowly ifwork_mem
is too small, as it spills to disk. - Increasing
work_mem
allows the sort to complete in memory, speeding up the query.
- A query with a large
shared_buffers
:- A query that repeatedly accesses the same table might perform slowly if
shared_buffers
is too small, as it has to read from disk each time. - Increasing
shared_buffers
caches the table in memory, reducing disk I/O.
- A query that repeatedly accesses the same table might perform slowly if
Summary Table
Parameter | work_mem | shared_buffers |
---|---|---|
Purpose | Memory for sorting/hashing per operation | Memory for caching data pages globally |
Scope | Per operation, per session | Global, shared across all sessions |
Default Value | 4MB | 128MB |
Impact | Improves sorting/hashing performance | Reduces disk I/O |
When to Adjust | Disk spills during sorts/hashes | Frequent disk reads |
By tuning these parameters appropriately, you can optimize PostgreSQL’s performance for your specific workload.