资源使用情况/内存

autovacuum_work_mem

属性
类别 资源使用情况/内存
说明 设置每个 autovacuum 工作进程要使用的最大内存。
数据类型 integer
默认值 -1
允许的值 -1-2097151
参数类型 动态
文档 autovacuum_work_mem

dynamic_shared_memory_type

属性
类别 资源使用情况/内存
说明 选择使用的动态共享内存实现。
数据类型 枚举
默认值 posix
允许的值 posix
参数类型 (只读)
文档 dynamic_shared_memory_type

hash_mem_multiplier

属性
类别 资源使用情况/内存
说明 要用于哈希表的多个 work_mem。
数据类型 numeric
默认值 2
允许的值 1-1000
参数类型 动态
文档 hash_mem_multiplier

huge_pages

Attribute
类别 资源使用情况/内存
说明 允许/禁止使用大型内存页。 此设置不适用于少于 4 个 vCore 的服务器。
数据类型 枚举
默认值 try
允许的值 on,off,try
参数类型 static
文档 huge_pages

说明

通过大型页面功能,可以在较大的块中管理内存。 通常可管理最大 2 MB 的块,而不是标准的 4 KB 页面。

使用大型页面可提供有效分流 CPU 的性能优势:

  • 它们减少了与内存管理任务相关的开销,例如更少的转换后备缓冲区 (TLB) 未命中。
  • 它们缩短了内存管理所需的时间。

具体来说,在 PostgreSQL 中,只能将大型页面用于共享内存区域。 共享内存区域的很大一部分分配给了共享缓冲区。

另一个优点是,大型页面可阻止将共享内存区域交换到磁盘,这进一步稳定了性能。

建议

  • 对于具有大量内存资源的服务器,请不要禁用大型页面。 禁用大型页面可能会损害性能。
  • 如果一开始使用不支持大型页面的较小服务器,但预计会纵向扩展到支持大型页面的服务器,那么请将 huge_pages 设置保留为 TRY,以保证无缝转换和最佳性能。

特定于 Azure 的注释

对于具有 4 个或更多 vCore 的服务器,会从基础操作系统自动分配大型页面。 此功能不适用于少于 4 个 vCore 的服务器。 如果更改了任何共享内存设置,则会自动调整大型页面数量,包括更改 shared_buffers

huge_page_size

属性
类别 资源使用情况/内存
说明 应请求的大型页的大小。
数据类型 integer
默认值 0
允许的值 0
参数类型 (只读)
文档 huge_page_size

logical_decoding_work_mem

属性
类别 资源使用情况/内存
说明 设置用于逻辑解码的最大内存。
数据类型 integer
默认值 65536
允许的值 64-2147483647
参数类型 动态
文档 logical_decoding_work_mem

maintenance_work_mem

Attribute
类别 资源使用情况/内存
说明 设置用于维护操作(如 VACUUM、“创建索引”)的最大内存。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 1024-2097151
参数类型 动态
文档 maintenance_work_mem

说明

maintenance_work_mem 是 PostgreSQL 中的一个配置参数。 它可控制为维护操作(例如 VACUUMCREATE INDEXALTER TABLE)分配的内存量。 与影响查询操作内存分配的 work_mem 不同,maintenance_work_mem 是为维护和优化数据库结构的任务保留的。

要点

  • Vacuum 内存上限:如果想要通过增加 maintenance_work_mem 来更快地清理死元组,请注意,VACUUM 对于收集死元组标识符有内置限制。 对于此过程,只能使用最多 1 GB 的内存。
  • autovacuum 的内存分离:可以使用 autovacuum_work_mem 设置单独控制 autovacuum 操作使用的内存。 此设置充当 maintenance_work_mem 的子集。 你可以决定在不影响其他维护任务和数据定义操作的内存分配的情况下 autovacuum 使用的内存量。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 maintenance_work_mem 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 maintenance_work_mem 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 maintenance_work_mem 参数的值。

用于计算 maintenance_work_mem 的值的公式是 (long)(82.5 * ln(memoryGiB) + 40) * 1024

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 maintenance_work_mem
2 GiB 99328 KiB
4 GiB 157696 KiB
8 GiB 216064 KiB
16 GiB 274432 KiB
32 GiB 332800 KiB
48 GiB 367616 KiB
64 GiB 392192 KiB
80 GiB 410624 KiB
128 GiB 450560 KiB
160 GiB 468992 KiB
192 GiB 484352 KiB
256 GiB 508928 KiB
384 GiB 542720 KiB
432 GiB 552960 KiB
672 GiB 590848 KiB

max_prepared_transactions

属性
类别 资源使用情况/内存
说明 设置同时准备的事务数量上限。 运行副本服务器时,必须将此参数设置为与主服务器上的值相同或更高的值。
数据类型 integer
默认值 0
允许的值 0-262143
参数类型 static
文档 max_prepared_transactions

max_stack_depth

属性
类别 资源使用情况/内存
说明 设置最大堆栈深度(以 KB 为单位)。
数据类型 integer
默认值 2048
允许的值 2048
参数类型 (只读)
文档 max_stack_depth

min_dynamic_shared_memory

属性
类别 资源使用情况/内存
说明 启动时保留的动态共享内存量。
数据类型 integer
默认值 0
允许的值 0
参数类型 (只读)
文档 min_dynamic_shared_memory

shared_buffers

Attribute
类别 资源使用情况/内存
说明 设置服务器使用的共享内存缓冲区数。 单位为 8kb。 允许的值在 10% - 75% 的可用内存范围内。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 16-1073741823
参数类型 static
文档 shared_buffers

说明

shared_buffers 配置参数确定分配给 PostgreSQL 数据库用于缓冲数据的系统内存量。 它是可供所有数据库进程访问的集中式内存池。

需要数据时,数据库进程首先检查共享缓冲区。 如果存在所需的数据,会快速检索此数据,并绕过更耗时的磁盘读取。 共享缓冲区在数据库进程和磁盘之间充当中介,并有效地减少所需的 I/O 操作数。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 shared_buffers 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 shared_buffers 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 shared_buffers 参数的值。

对于内存最多 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 16384

对于超过 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 32768

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

shared_memory_type

属性
类别 资源使用情况/内存
说明 选择用于主共享内存区域的共享内存实现。
数据类型 枚举
默认值 mmap
允许的值 mmap
参数类型 (只读)
文档 shared_memory_type

temp_buffers

属性
类别 资源使用情况/内存
说明 设置每个数据库会话使用的临时缓冲区数量上限。
数据类型 integer
默认值 1024
允许的值 100-1073741823
参数类型 动态
文档 temp_buffers

work_mem

Attribute
类别 资源使用情况/内存
说明 设置写入到临时磁盘文件之前内部排序操作和哈希表要使用的内存量。
数据类型 integer
默认值 4096
允许的值 4096-2097151
参数类型 动态
文档 work_mem

说明

PostgreSQL 中的 work_mem 参数可控制在每个数据库会话的专用内存区域中为某些内部操作分配的内存量。 这些操作的示例包括排序和哈希处理。

与共享内存区域中的共享缓冲区不同,work_mem 是在每个会话或每个查询的专用内存空间中分配的。 通过设置足够的 work_mem 大小,可以显著提高这些操作的效率,并减少将临时数据写入磁盘的需求。

要点

  • 专用连接内存work_mem 是每个数据库会话使用的专用内存的一部分。 此内存不同于 shared_buffers 使用的共享内存区域。
  • 特定于查询的用法:并非所有会话或查询都使用 work_mem 简单的查询(例如 SELECT 1)不太可能需要 work_mem。 但是,涉及排序或哈希处理等操作的复杂查询可能使用 work_mem 的一个或多个区块。
  • 并行操作:对于跨多个并行后端的查询,每个后端可能会使用 work_mem 的一个或多个区块。

监视和调整 work_mem

必须持续监视系统性能,并根据需要调整 work_mem,主要是在与排序或哈希处理操作相关的查询执行时间缓慢时。 下面是使用 Azure 门户中提供的工具监视性能的方法:

  • 查询性能见解:查看“按临时文件数排名靠前的查询”选项卡,以确定生成临时文件的查询。 这种情况表明,可能需要增加 work_mem
  • 故障排除指南:使用故障排除指南中的“大量临时文件”选项卡来确定有问题的查询。
精细调整

在管理 work_mem 参数时,采用精细调整方法通常比设置全局值更高效。 此方法可确保根据进程和用户的特定需求明智地分配内存。 它还将遇到内存不足问题的风险降到最低。 下面是实现这一点的步骤:

  • 用户级别:如果特定用户主要涉及聚合或报告任务(内存密集型任务),请考虑自定义该用户的 work_mem 值。 使用 ALTER ROLE 命令提高用户操作的性能。

  • 函数/过程级别:如果特定函数或过程生成大量临时文件,那么增加特定函数或过程级别的 work_mem 值可能会有所帮助。 使用 ALTER FUNCTIONALTER PROCEDURE 命令专门为这些操作分配更多内存。

  • 数据库级别:如果只有特定数据库生成大量临时文件,请在数据库级别更改 work_mem

  • 全局级别:如果系统分析显示大多数查询生成小型临时文件,而只有少数查询创建大型临时文件,那么最好全局调高 work_mem 值。 此操作可促使在内存中处理大多数查询,这样就可避免基于磁盘的操作并提高效率。 但是,请始终谨慎操作并监视服务器上的内存利用率,确保它可处理增加的 work_mem 值。

确定排序操作的最小 work_mem 值

若要查找特定查询的最小 work_mem 值,尤其是在排序过程中生成临时磁盘文件的查询,请先考虑在查询执行期间生成的临时文件大小。 例如,如果一个查询生成一个 20 MB 的临时文件:

  1. 使用 psql 或偏好的 PostgreSQL 客户端连接到数据库。
  2. 设置略高于 20 MB 的初始 work_mem 值,以便在内存中处理时考虑到额外的标头。 使用 SET work_mem TO '25MB' 等命令。
  3. 在同一会话上对有问题的查询运行 EXPLAIN ANALYZE
  4. 查看 "Sort Method: quicksort Memory: xkB" 的输出。 如果指示 "external merge Disk: xkB",请以增量方式增加 work_mem 值并重新测试,直到出现 "quicksort Memory"。 出现 "quicksort Memory" 即表示查询现在内存中运行。
  5. 通过此方法确定值后,可以全局应用该值,也可在更精细的级别应用它(如上所述)来满足你的操作需求。

autovacuum_work_mem

属性
类别 资源使用情况/内存
说明 设置每个 autovacuum 工作进程要使用的最大内存。
数据类型 integer
默认值 -1
允许的值 -1-2097151
参数类型 动态
文档 autovacuum_work_mem

dynamic_shared_memory_type

属性
类别 资源使用情况/内存
说明 选择使用的动态共享内存实现。
数据类型 枚举
默认值 posix
允许的值 posix
参数类型 (只读)
文档 dynamic_shared_memory_type

hash_mem_multiplier

属性
类别 资源使用情况/内存
说明 要用于哈希表的多个 work_mem。
数据类型 numeric
默认值 2
允许的值 1-1000
参数类型 动态
文档 hash_mem_multiplier

huge_pages

Attribute
类别 资源使用情况/内存
说明 允许/禁止使用大型内存页。 此设置不适用于少于 4 个 vCore 的服务器。
数据类型 枚举
默认值 try
允许的值 on,off,try
参数类型 static
文档 huge_pages

说明

通过大型页面功能,可以在较大的块中管理内存。 通常可管理最大 2 MB 的块,而不是标准的 4 KB 页面。

使用大型页面可提供有效分流 CPU 的性能优势:

  • 它们减少了与内存管理任务相关的开销,例如更少的转换后备缓冲区 (TLB) 未命中。
  • 它们缩短了内存管理所需的时间。

具体来说,在 PostgreSQL 中,只能将大型页面用于共享内存区域。 共享内存区域的很大一部分分配给了共享缓冲区。

另一个优点是,大型页面可阻止将共享内存区域交换到磁盘,这进一步稳定了性能。

建议

  • 对于具有大量内存资源的服务器,请不要禁用大型页面。 禁用大型页面可能会损害性能。
  • 如果一开始使用不支持大型页面的较小服务器,但预计会纵向扩展到支持大型页面的服务器,那么请将 huge_pages 设置保留为 TRY,以保证无缝转换和最佳性能。

特定于 Azure 的注释

对于具有 4 个或更多 vCore 的服务器,会从基础操作系统自动分配大型页面。 此功能不适用于少于 4 个 vCore 的服务器。 如果更改了任何共享内存设置,则会自动调整大型页面数量,包括更改 shared_buffers

huge_page_size

属性
类别 资源使用情况/内存
说明 应请求的大型页的大小。
数据类型 integer
默认值 0
允许的值 0
参数类型 (只读)
文档 huge_page_size

logical_decoding_work_mem

属性
类别 资源使用情况/内存
说明 设置用于逻辑解码的最大内存。
数据类型 integer
默认值 65536
允许的值 64-2147483647
参数类型 动态
文档 logical_decoding_work_mem

maintenance_work_mem

Attribute
类别 资源使用情况/内存
说明 设置用于维护操作(如 VACUUM、“创建索引”)的最大内存。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 1024-2097151
参数类型 动态
文档 maintenance_work_mem

说明

maintenance_work_mem 是 PostgreSQL 中的一个配置参数。 它可控制为维护操作(例如 VACUUMCREATE INDEXALTER TABLE)分配的内存量。 与影响查询操作内存分配的 work_mem 不同,maintenance_work_mem 是为维护和优化数据库结构的任务保留的。

要点

  • Vacuum 内存上限:如果想要通过增加 maintenance_work_mem 来更快地清理死元组,请注意,VACUUM 对于收集死元组标识符有内置限制。 对于此过程,只能使用最多 1 GB 的内存。
  • autovacuum 的内存分离:可以使用 autovacuum_work_mem 设置单独控制 autovacuum 操作使用的内存。 此设置充当 maintenance_work_mem 的子集。 你可以决定在不影响其他维护任务和数据定义操作的内存分配的情况下 autovacuum 使用的内存量。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 maintenance_work_mem 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 maintenance_work_mem 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 maintenance_work_mem 参数的值。

用于计算 maintenance_work_mem 的值的公式是 (long)(82.5 * ln(memoryGiB) + 40) * 1024

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 maintenance_work_mem
2 GiB 99328 KiB
4 GiB 157696 KiB
8 GiB 216064 KiB
16 GiB 274432 KiB
32 GiB 332800 KiB
48 GiB 367616 KiB
64 GiB 392192 KiB
80 GiB 410624 KiB
128 GiB 450560 KiB
160 GiB 468992 KiB
192 GiB 484352 KiB
256 GiB 508928 KiB
384 GiB 542720 KiB
432 GiB 552960 KiB
672 GiB 590848 KiB

max_prepared_transactions

属性
类别 资源使用情况/内存
说明 设置同时准备的事务数量上限。 运行副本服务器时,必须将此参数设置为与主服务器上的值相同或更高的值。
数据类型 integer
默认值 0
允许的值 0-262143
参数类型 static
文档 max_prepared_transactions

max_stack_depth

属性
类别 资源使用情况/内存
说明 设置最大堆栈深度(以 KB 为单位)。
数据类型 integer
默认值 2048
允许的值 2048
参数类型 (只读)
文档 max_stack_depth

min_dynamic_shared_memory

属性
类别 资源使用情况/内存
说明 启动时保留的动态共享内存量。
数据类型 integer
默认值 0
允许的值 0
参数类型 (只读)
文档 min_dynamic_shared_memory

shared_buffers

Attribute
类别 资源使用情况/内存
说明 设置服务器使用的共享内存缓冲区数。 单位为 8kb。 允许的值在 10% - 75% 的可用内存范围内。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 16-1073741823
参数类型 static
文档 shared_buffers

说明

shared_buffers 配置参数确定分配给 PostgreSQL 数据库用于缓冲数据的系统内存量。 它是可供所有数据库进程访问的集中式内存池。

需要数据时,数据库进程首先检查共享缓冲区。 如果存在所需的数据,会快速检索此数据,并绕过更耗时的磁盘读取。 共享缓冲区在数据库进程和磁盘之间充当中介,并有效地减少所需的 I/O 操作数。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 shared_buffers 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 shared_buffers 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 shared_buffers 参数的值。

对于内存最多 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 16384

对于超过 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 32768

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

shared_memory_type

属性
类别 资源使用情况/内存
说明 选择用于主共享内存区域的共享内存实现。
数据类型 枚举
默认值 mmap
允许的值 mmap
参数类型 (只读)
文档 shared_memory_type

temp_buffers

属性
类别 资源使用情况/内存
说明 设置每个数据库会话使用的临时缓冲区数量上限。
数据类型 integer
默认值 1024
允许的值 100-1073741823
参数类型 动态
文档 temp_buffers

work_mem

Attribute
类别 资源使用情况/内存
说明 设置写入到临时磁盘文件之前内部排序操作和哈希表要使用的内存量。
数据类型 integer
默认值 4096
允许的值 4096-2097151
参数类型 动态
文档 work_mem

说明

PostgreSQL 中的 work_mem 参数可控制在每个数据库会话的专用内存区域中为某些内部操作分配的内存量。 这些操作的示例包括排序和哈希处理。

与共享内存区域中的共享缓冲区不同,work_mem 是在每个会话或每个查询的专用内存空间中分配的。 通过设置足够的 work_mem 大小,可以显著提高这些操作的效率,并减少将临时数据写入磁盘的需求。

要点

  • 专用连接内存work_mem 是每个数据库会话使用的专用内存的一部分。 此内存不同于 shared_buffers 使用的共享内存区域。
  • 特定于查询的用法:并非所有会话或查询都使用 work_mem 简单的查询(例如 SELECT 1)不太可能需要 work_mem。 但是,涉及排序或哈希处理等操作的复杂查询可能使用 work_mem 的一个或多个区块。
  • 并行操作:对于跨多个并行后端的查询,每个后端可能会使用 work_mem 的一个或多个区块。

监视和调整 work_mem

必须持续监视系统性能,并根据需要调整 work_mem,主要是在与排序或哈希处理操作相关的查询执行时间缓慢时。 下面是使用 Azure 门户中提供的工具监视性能的方法:

  • 查询性能见解:查看“按临时文件数排名靠前的查询”选项卡,以确定生成临时文件的查询。 这种情况表明,可能需要增加 work_mem
  • 故障排除指南:使用故障排除指南中的“大量临时文件”选项卡来确定有问题的查询。
精细调整

在管理 work_mem 参数时,采用精细调整方法通常比设置全局值更高效。 此方法可确保根据进程和用户的特定需求明智地分配内存。 它还将遇到内存不足问题的风险降到最低。 下面是实现这一点的步骤:

  • 用户级别:如果特定用户主要涉及聚合或报告任务(内存密集型任务),请考虑自定义该用户的 work_mem 值。 使用 ALTER ROLE 命令提高用户操作的性能。

  • 函数/过程级别:如果特定函数或过程生成大量临时文件,那么增加特定函数或过程级别的 work_mem 值可能会有所帮助。 使用 ALTER FUNCTIONALTER PROCEDURE 命令专门为这些操作分配更多内存。

  • 数据库级别:如果只有特定数据库生成大量临时文件,请在数据库级别更改 work_mem

  • 全局级别:如果系统分析显示大多数查询生成小型临时文件,而只有少数查询创建大型临时文件,那么最好全局调高 work_mem 值。 此操作可促使在内存中处理大多数查询,这样就可避免基于磁盘的操作并提高效率。 但是,请始终谨慎操作并监视服务器上的内存利用率,确保它可处理增加的 work_mem 值。

确定排序操作的最小 work_mem 值

若要查找特定查询的最小 work_mem 值,尤其是在排序过程中生成临时磁盘文件的查询,请先考虑在查询执行期间生成的临时文件大小。 例如,如果一个查询生成一个 20 MB 的临时文件:

  1. 使用 psql 或偏好的 PostgreSQL 客户端连接到数据库。
  2. 设置略高于 20 MB 的初始 work_mem 值,以便在内存中处理时考虑到额外的标头。 使用 SET work_mem TO '25MB' 等命令。
  3. 在同一会话上对有问题的查询运行 EXPLAIN ANALYZE
  4. 查看 "Sort Method: quicksort Memory: xkB" 的输出。 如果指示 "external merge Disk: xkB",请以增量方式增加 work_mem 值并重新测试,直到出现 "quicksort Memory"。 出现 "quicksort Memory" 即表示查询现在内存中运行。
  5. 通过此方法确定值后,可以全局应用该值,也可在更精细的级别应用它(如上所述)来满足你的操作需求。

autovacuum_work_mem

属性
类别 资源使用情况/内存
说明 设置每个 autovacuum 工作进程要使用的最大内存。
数据类型 integer
默认值 -1
允许的值 -1-2097151
参数类型 动态
文档 autovacuum_work_mem

dynamic_shared_memory_type

属性
类别 资源使用情况/内存
说明 选择使用的动态共享内存实现。
数据类型 枚举
默认值 posix
允许的值 posix
参数类型 (只读)
文档 dynamic_shared_memory_type

hash_mem_multiplier

属性
类别 资源使用情况/内存
说明 要用于哈希表的多个 work_mem。
数据类型 numeric
默认值 1
允许的值 1-1000
参数类型 动态
文档 hash_mem_multiplier

huge_pages

Attribute
类别 资源使用情况/内存
说明 允许/禁止使用大型内存页。 此设置不适用于少于 4 个 vCore 的服务器。
数据类型 枚举
默认值 try
允许的值 on,off,try
参数类型 static
文档 huge_pages

说明

通过大型页面功能,可以在较大的块中管理内存。 通常可管理最大 2 MB 的块,而不是标准的 4 KB 页面。

使用大型页面可提供有效分流 CPU 的性能优势:

  • 它们减少了与内存管理任务相关的开销,例如更少的转换后备缓冲区 (TLB) 未命中。
  • 它们缩短了内存管理所需的时间。

具体来说,在 PostgreSQL 中,只能将大型页面用于共享内存区域。 共享内存区域的很大一部分分配给了共享缓冲区。

另一个优点是,大型页面可阻止将共享内存区域交换到磁盘,这进一步稳定了性能。

建议

  • 对于具有大量内存资源的服务器,请不要禁用大型页面。 禁用大型页面可能会损害性能。
  • 如果一开始使用不支持大型页面的较小服务器,但预计会纵向扩展到支持大型页面的服务器,那么请将 huge_pages 设置保留为 TRY,以保证无缝转换和最佳性能。

特定于 Azure 的注释

对于具有 4 个或更多 vCore 的服务器,会从基础操作系统自动分配大型页面。 此功能不适用于少于 4 个 vCore 的服务器。 如果更改了任何共享内存设置,则会自动调整大型页面数量,包括更改 shared_buffers

huge_page_size

属性
类别 资源使用情况/内存
说明 应请求的大型页的大小。
数据类型 integer
默认值 0
允许的值 0
参数类型 (只读)
文档 huge_page_size

logical_decoding_work_mem

属性
类别 资源使用情况/内存
说明 设置用于逻辑解码的最大内存。
数据类型 integer
默认值 65536
允许的值 64-2147483647
参数类型 动态
文档 logical_decoding_work_mem

maintenance_work_mem

Attribute
类别 资源使用情况/内存
说明 设置用于维护操作(如 VACUUM、“创建索引”)的最大内存。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 1024-2097151
参数类型 动态
文档 maintenance_work_mem

说明

maintenance_work_mem 是 PostgreSQL 中的一个配置参数。 它可控制为维护操作(例如 VACUUMCREATE INDEXALTER TABLE)分配的内存量。 与影响查询操作内存分配的 work_mem 不同,maintenance_work_mem 是为维护和优化数据库结构的任务保留的。

要点

  • Vacuum 内存上限:如果想要通过增加 maintenance_work_mem 来更快地清理死元组,请注意,VACUUM 对于收集死元组标识符有内置限制。 对于此过程,只能使用最多 1 GB 的内存。
  • autovacuum 的内存分离:可以使用 autovacuum_work_mem 设置单独控制 autovacuum 操作使用的内存。 此设置充当 maintenance_work_mem 的子集。 你可以决定在不影响其他维护任务和数据定义操作的内存分配的情况下 autovacuum 使用的内存量。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 maintenance_work_mem 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 maintenance_work_mem 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 maintenance_work_mem 参数的值。

用于计算 maintenance_work_mem 的值的公式是 (long)(82.5 * ln(memoryGiB) + 40) * 1024

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 maintenance_work_mem
2 GiB 99328 KiB
4 GiB 157696 KiB
8 GiB 216064 KiB
16 GiB 274432 KiB
32 GiB 332800 KiB
48 GiB 367616 KiB
64 GiB 392192 KiB
80 GiB 410624 KiB
128 GiB 450560 KiB
160 GiB 468992 KiB
192 GiB 484352 KiB
256 GiB 508928 KiB
384 GiB 542720 KiB
432 GiB 552960 KiB
672 GiB 590848 KiB

max_prepared_transactions

属性
类别 资源使用情况/内存
说明 设置同时准备的事务数量上限。 运行副本服务器时,必须将此参数设置为与主服务器上的值相同或更高的值。
数据类型 integer
默认值 0
允许的值 0-262143
参数类型 static
文档 max_prepared_transactions

max_stack_depth

属性
类别 资源使用情况/内存
说明 设置最大堆栈深度(以 KB 为单位)。
数据类型 integer
默认值 2048
允许的值 2048
参数类型 (只读)
文档 max_stack_depth

min_dynamic_shared_memory

属性
类别 资源使用情况/内存
说明 启动时保留的动态共享内存量。
数据类型 integer
默认值 0
允许的值 0
参数类型 (只读)
文档 min_dynamic_shared_memory

shared_buffers

Attribute
类别 资源使用情况/内存
说明 设置服务器使用的共享内存缓冲区数。 单位为 8kb。 允许的值在 10% - 75% 的可用内存范围内。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 16-1073741823
参数类型 static
文档 shared_buffers

说明

shared_buffers 配置参数确定分配给 PostgreSQL 数据库用于缓冲数据的系统内存量。 它是可供所有数据库进程访问的集中式内存池。

需要数据时,数据库进程首先检查共享缓冲区。 如果存在所需的数据,会快速检索此数据,并绕过更耗时的磁盘读取。 共享缓冲区在数据库进程和磁盘之间充当中介,并有效地减少所需的 I/O 操作数。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 shared_buffers 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 shared_buffers 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 shared_buffers 参数的值。

对于内存最多 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 16384

对于超过 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 32768

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

shared_memory_type

属性
类别 资源使用情况/内存
说明 选择用于主共享内存区域的共享内存实现。
数据类型 枚举
默认值 mmap
允许的值 mmap
参数类型 (只读)
文档 shared_memory_type

temp_buffers

属性
类别 资源使用情况/内存
说明 设置每个数据库会话使用的临时缓冲区数量上限。
数据类型 integer
默认值 1024
允许的值 100-1073741823
参数类型 动态
文档 temp_buffers

work_mem

Attribute
类别 资源使用情况/内存
说明 设置写入到临时磁盘文件之前内部排序操作和哈希表要使用的内存量。
数据类型 integer
默认值 4096
允许的值 4096-2097151
参数类型 动态
文档 work_mem

说明

PostgreSQL 中的 work_mem 参数可控制在每个数据库会话的专用内存区域中为某些内部操作分配的内存量。 这些操作的示例包括排序和哈希处理。

与共享内存区域中的共享缓冲区不同,work_mem 是在每个会话或每个查询的专用内存空间中分配的。 通过设置足够的 work_mem 大小,可以显著提高这些操作的效率,并减少将临时数据写入磁盘的需求。

要点

  • 专用连接内存work_mem 是每个数据库会话使用的专用内存的一部分。 此内存不同于 shared_buffers 使用的共享内存区域。
  • 特定于查询的用法:并非所有会话或查询都使用 work_mem 简单的查询(例如 SELECT 1)不太可能需要 work_mem。 但是,涉及排序或哈希处理等操作的复杂查询可能使用 work_mem 的一个或多个区块。
  • 并行操作:对于跨多个并行后端的查询,每个后端可能会使用 work_mem 的一个或多个区块。

监视和调整 work_mem

必须持续监视系统性能,并根据需要调整 work_mem,主要是在与排序或哈希处理操作相关的查询执行时间缓慢时。 下面是使用 Azure 门户中提供的工具监视性能的方法:

  • 查询性能见解:查看“按临时文件数排名靠前的查询”选项卡,以确定生成临时文件的查询。 这种情况表明,可能需要增加 work_mem
  • 故障排除指南:使用故障排除指南中的“大量临时文件”选项卡来确定有问题的查询。
精细调整

在管理 work_mem 参数时,采用精细调整方法通常比设置全局值更高效。 此方法可确保根据进程和用户的特定需求明智地分配内存。 它还将遇到内存不足问题的风险降到最低。 下面是实现这一点的步骤:

  • 用户级别:如果特定用户主要涉及聚合或报告任务(内存密集型任务),请考虑自定义该用户的 work_mem 值。 使用 ALTER ROLE 命令提高用户操作的性能。

  • 函数/过程级别:如果特定函数或过程生成大量临时文件,那么增加特定函数或过程级别的 work_mem 值可能会有所帮助。 使用 ALTER FUNCTIONALTER PROCEDURE 命令专门为这些操作分配更多内存。

  • 数据库级别:如果只有特定数据库生成大量临时文件,请在数据库级别更改 work_mem

  • 全局级别:如果系统分析显示大多数查询生成小型临时文件,而只有少数查询创建大型临时文件,那么最好全局调高 work_mem 值。 此操作可促使在内存中处理大多数查询,这样就可避免基于磁盘的操作并提高效率。 但是,请始终谨慎操作并监视服务器上的内存利用率,确保它可处理增加的 work_mem 值。

确定排序操作的最小 work_mem 值

若要查找特定查询的最小 work_mem 值,尤其是在排序过程中生成临时磁盘文件的查询,请先考虑在查询执行期间生成的临时文件大小。 例如,如果一个查询生成一个 20 MB 的临时文件:

  1. 使用 psql 或偏好的 PostgreSQL 客户端连接到数据库。
  2. 设置略高于 20 MB 的初始 work_mem 值,以便在内存中处理时考虑到额外的标头。 使用 SET work_mem TO '25MB' 等命令。
  3. 在同一会话上对有问题的查询运行 EXPLAIN ANALYZE
  4. 查看 "Sort Method: quicksort Memory: xkB" 的输出。 如果指示 "external merge Disk: xkB",请以增量方式增加 work_mem 值并重新测试,直到出现 "quicksort Memory"。 出现 "quicksort Memory" 即表示查询现在内存中运行。
  5. 通过此方法确定值后,可以全局应用该值,也可在更精细的级别应用它(如上所述)来满足你的操作需求。

autovacuum_work_mem

属性
类别 资源使用情况/内存
说明 设置每个 autovacuum 工作进程要使用的最大内存。
数据类型 integer
默认值 -1
允许的值 -1-2097151
参数类型 动态
文档 autovacuum_work_mem

dynamic_shared_memory_type

属性
类别 资源使用情况/内存
说明 选择使用的动态共享内存实现。
数据类型 枚举
默认值 posix
允许的值 posix
参数类型 (只读)
文档 dynamic_shared_memory_type

hash_mem_multiplier

属性
类别 资源使用情况/内存
说明 要用于哈希表的多个 work_mem。
数据类型 numeric
默认值 1
允许的值 1-1000
参数类型 动态
文档 hash_mem_multiplier

huge_pages

Attribute
类别 资源使用情况/内存
说明 允许/禁止使用大型内存页。 此设置不适用于少于 4 个 vCore 的服务器。
数据类型 枚举
默认值 try
允许的值 on,off,try
参数类型 static
文档 huge_pages

说明

通过大型页面功能,可以在较大的块中管理内存。 通常可管理最大 2 MB 的块,而不是标准的 4 KB 页面。

使用大型页面可提供有效分流 CPU 的性能优势:

  • 它们减少了与内存管理任务相关的开销,例如更少的转换后备缓冲区 (TLB) 未命中。
  • 它们缩短了内存管理所需的时间。

具体来说,在 PostgreSQL 中,只能将大型页面用于共享内存区域。 共享内存区域的很大一部分分配给了共享缓冲区。

另一个优点是,大型页面可阻止将共享内存区域交换到磁盘,这进一步稳定了性能。

建议

  • 对于具有大量内存资源的服务器,请不要禁用大型页面。 禁用大型页面可能会损害性能。
  • 如果一开始使用不支持大型页面的较小服务器,但预计会纵向扩展到支持大型页面的服务器,那么请将 huge_pages 设置保留为 TRY,以保证无缝转换和最佳性能。

特定于 Azure 的注释

对于具有 4 个或更多 vCore 的服务器,会从基础操作系统自动分配大型页面。 此功能不适用于少于 4 个 vCore 的服务器。 如果更改了任何共享内存设置,则会自动调整大型页面数量,包括更改 shared_buffers

logical_decoding_work_mem

属性
类别 资源使用情况/内存
说明 设置用于逻辑解码的最大内存。
数据类型 integer
默认值 65536
允许的值 64-2147483647
参数类型 动态
文档 logical_decoding_work_mem

maintenance_work_mem

Attribute
类别 资源使用情况/内存
说明 设置用于维护操作(如 VACUUM、“创建索引”)的最大内存。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 1024-2097151
参数类型 动态
文档 maintenance_work_mem

说明

maintenance_work_mem 是 PostgreSQL 中的一个配置参数。 它可控制为维护操作(例如 VACUUMCREATE INDEXALTER TABLE)分配的内存量。 与影响查询操作内存分配的 work_mem 不同,maintenance_work_mem 是为维护和优化数据库结构的任务保留的。

要点

  • Vacuum 内存上限:如果想要通过增加 maintenance_work_mem 来更快地清理死元组,请注意,VACUUM 对于收集死元组标识符有内置限制。 对于此过程,只能使用最多 1 GB 的内存。
  • autovacuum 的内存分离:可以使用 autovacuum_work_mem 设置单独控制 autovacuum 操作使用的内存。 此设置充当 maintenance_work_mem 的子集。 你可以决定在不影响其他维护任务和数据定义操作的内存分配的情况下 autovacuum 使用的内存量。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 maintenance_work_mem 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 maintenance_work_mem 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 maintenance_work_mem 参数的值。

用于计算 maintenance_work_mem 的值的公式是 (long)(82.5 * ln(memoryGiB) + 40) * 1024

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 maintenance_work_mem
2 GiB 99328 KiB
4 GiB 157696 KiB
8 GiB 216064 KiB
16 GiB 274432 KiB
32 GiB 332800 KiB
48 GiB 367616 KiB
64 GiB 392192 KiB
80 GiB 410624 KiB
128 GiB 450560 KiB
160 GiB 468992 KiB
192 GiB 484352 KiB
256 GiB 508928 KiB
384 GiB 542720 KiB
432 GiB 552960 KiB
672 GiB 590848 KiB

max_prepared_transactions

属性
类别 资源使用情况/内存
说明 设置同时准备的事务数量上限。 运行副本服务器时,必须将此参数设置为与主服务器上的值相同或更高的值。
数据类型 integer
默认值 0
允许的值 0-262143
参数类型 static
文档 max_prepared_transactions

max_stack_depth

属性
类别 资源使用情况/内存
说明 设置最大堆栈深度(以 KB 为单位)。
数据类型 integer
默认值 2048
允许的值 2048
参数类型 (只读)
文档 max_stack_depth

shared_buffers

Attribute
类别 资源使用情况/内存
说明 设置服务器使用的共享内存缓冲区数。 单位为 8kb。 允许的值在 10% - 75% 的可用内存范围内。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 16-1073741823
参数类型 static
文档 shared_buffers

说明

shared_buffers 配置参数确定分配给 PostgreSQL 数据库用于缓冲数据的系统内存量。 它是可供所有数据库进程访问的集中式内存池。

需要数据时,数据库进程首先检查共享缓冲区。 如果存在所需的数据,会快速检索此数据,并绕过更耗时的磁盘读取。 共享缓冲区在数据库进程和磁盘之间充当中介,并有效地减少所需的 I/O 操作数。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 shared_buffers 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 shared_buffers 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 shared_buffers 参数的值。

对于内存最多 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 16384

对于超过 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 32768

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

shared_memory_type

属性
类别 资源使用情况/内存
说明 选择用于主共享内存区域的共享内存实现。
数据类型 枚举
默认值 mmap
允许的值 mmap
参数类型 (只读)
文档 shared_memory_type

temp_buffers

属性
类别 资源使用情况/内存
说明 设置每个数据库会话使用的临时缓冲区数量上限。
数据类型 integer
默认值 1024
允许的值 100-1073741823
参数类型 动态
文档 temp_buffers

work_mem

Attribute
类别 资源使用情况/内存
说明 设置写入到临时磁盘文件之前内部排序操作和哈希表要使用的内存量。
数据类型 integer
默认值 4096
允许的值 4096-2097151
参数类型 动态
文档 work_mem

说明

PostgreSQL 中的 work_mem 参数可控制在每个数据库会话的专用内存区域中为某些内部操作分配的内存量。 这些操作的示例包括排序和哈希处理。

与共享内存区域中的共享缓冲区不同,work_mem 是在每个会话或每个查询的专用内存空间中分配的。 通过设置足够的 work_mem 大小,可以显著提高这些操作的效率,并减少将临时数据写入磁盘的需求。

要点

  • 专用连接内存work_mem 是每个数据库会话使用的专用内存的一部分。 此内存不同于 shared_buffers 使用的共享内存区域。
  • 特定于查询的用法:并非所有会话或查询都使用 work_mem 简单的查询(例如 SELECT 1)不太可能需要 work_mem。 但是,涉及排序或哈希处理等操作的复杂查询可能使用 work_mem 的一个或多个区块。
  • 并行操作:对于跨多个并行后端的查询,每个后端可能会使用 work_mem 的一个或多个区块。

监视和调整 work_mem

必须持续监视系统性能,并根据需要调整 work_mem,主要是在与排序或哈希处理操作相关的查询执行时间缓慢时。 下面是使用 Azure 门户中提供的工具监视性能的方法:

  • 查询性能见解:查看“按临时文件数排名靠前的查询”选项卡,以确定生成临时文件的查询。 这种情况表明,可能需要增加 work_mem
  • 故障排除指南:使用故障排除指南中的“大量临时文件”选项卡来确定有问题的查询。
精细调整

在管理 work_mem 参数时,采用精细调整方法通常比设置全局值更高效。 此方法可确保根据进程和用户的特定需求明智地分配内存。 它还将遇到内存不足问题的风险降到最低。 下面是实现这一点的步骤:

  • 用户级别:如果特定用户主要涉及聚合或报告任务(内存密集型任务),请考虑自定义该用户的 work_mem 值。 使用 ALTER ROLE 命令提高用户操作的性能。

  • 函数/过程级别:如果特定函数或过程生成大量临时文件,那么增加特定函数或过程级别的 work_mem 值可能会有所帮助。 使用 ALTER FUNCTIONALTER PROCEDURE 命令专门为这些操作分配更多内存。

  • 数据库级别:如果只有特定数据库生成大量临时文件,请在数据库级别更改 work_mem

  • 全局级别:如果系统分析显示大多数查询生成小型临时文件,而只有少数查询创建大型临时文件,那么最好全局调高 work_mem 值。 此操作可促使在内存中处理大多数查询,这样就可避免基于磁盘的操作并提高效率。 但是,请始终谨慎操作并监视服务器上的内存利用率,确保它可处理增加的 work_mem 值。

确定排序操作的最小 work_mem 值

若要查找特定查询的最小 work_mem 值,尤其是在排序过程中生成临时磁盘文件的查询,请先考虑在查询执行期间生成的临时文件大小。 例如,如果一个查询生成一个 20 MB 的临时文件:

  1. 使用 psql 或偏好的 PostgreSQL 客户端连接到数据库。
  2. 设置略高于 20 MB 的初始 work_mem 值,以便在内存中处理时考虑到额外的标头。 使用 SET work_mem TO '25MB' 等命令。
  3. 在同一会话上对有问题的查询运行 EXPLAIN ANALYZE
  4. 查看 "Sort Method: quicksort Memory: xkB" 的输出。 如果指示 "external merge Disk: xkB",请以增量方式增加 work_mem 值并重新测试,直到出现 "quicksort Memory"。 出现 "quicksort Memory" 即表示查询现在内存中运行。
  5. 通过此方法确定值后,可以全局应用该值,也可在更精细的级别应用它(如上所述)来满足你的操作需求。

autovacuum_work_mem

属性
类别 资源使用情况/内存
说明 设置每个 autovacuum 工作进程要使用的最大内存。
数据类型 integer
默认值 -1
允许的值 -1-2097151
参数类型 动态
文档 autovacuum_work_mem

dynamic_shared_memory_type

属性
类别 资源使用情况/内存
说明 选择使用的动态共享内存实现。
数据类型 枚举
默认值 posix
允许的值 posix
参数类型 (只读)
文档 dynamic_shared_memory_type

hash_mem_multiplier

属性
类别 资源使用情况/内存
说明 要用于哈希表的多个 work_mem。
数据类型 numeric
默认值 1
允许的值 1-1000
参数类型 动态
文档 hash_mem_multiplier

huge_pages

Attribute
类别 资源使用情况/内存
说明 允许/禁止使用大型内存页。 此设置不适用于少于 4 个 vCore 的服务器。
数据类型 枚举
默认值 try
允许的值 on,off,try
参数类型 static
文档 huge_pages

说明

通过大型页面功能,可以在较大的块中管理内存。 通常可管理最大 2 MB 的块,而不是标准的 4 KB 页面。

使用大型页面可提供有效分流 CPU 的性能优势:

  • 它们减少了与内存管理任务相关的开销,例如更少的转换后备缓冲区 (TLB) 未命中。
  • 它们缩短了内存管理所需的时间。

具体来说,在 PostgreSQL 中,只能将大型页面用于共享内存区域。 共享内存区域的很大一部分分配给了共享缓冲区。

另一个优点是,大型页面可阻止将共享内存区域交换到磁盘,这进一步稳定了性能。

建议

  • 对于具有大量内存资源的服务器,请不要禁用大型页面。 禁用大型页面可能会损害性能。
  • 如果一开始使用不支持大型页面的较小服务器,但预计会纵向扩展到支持大型页面的服务器,那么请将 huge_pages 设置保留为 TRY,以保证无缝转换和最佳性能。

特定于 Azure 的注释

对于具有 4 个或更多 vCore 的服务器,会从基础操作系统自动分配大型页面。 此功能不适用于少于 4 个 vCore 的服务器。 如果更改了任何共享内存设置,则会自动调整大型页面数量,包括更改 shared_buffers

maintenance_work_mem

Attribute
类别 资源使用情况/内存
说明 设置用于维护操作(如 VACUUM、“创建索引”)的最大内存。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 1024-2097151
参数类型 动态
文档 maintenance_work_mem

说明

maintenance_work_mem 是 PostgreSQL 中的一个配置参数。 它可控制为维护操作(例如 VACUUMCREATE INDEXALTER TABLE)分配的内存量。 与影响查询操作内存分配的 work_mem 不同,maintenance_work_mem 是为维护和优化数据库结构的任务保留的。

要点

  • Vacuum 内存上限:如果想要通过增加 maintenance_work_mem 来更快地清理死元组,请注意,VACUUM 对于收集死元组标识符有内置限制。 对于此过程,只能使用最多 1 GB 的内存。
  • autovacuum 的内存分离:可以使用 autovacuum_work_mem 设置单独控制 autovacuum 操作使用的内存。 此设置充当 maintenance_work_mem 的子集。 你可以决定在不影响其他维护任务和数据定义操作的内存分配的情况下 autovacuum 使用的内存量。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 maintenance_work_mem 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 maintenance_work_mem 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 maintenance_work_mem 参数的值。

用于计算 maintenance_work_mem 的值的公式是 (long)(82.5 * ln(memoryGiB) + 40) * 1024

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 maintenance_work_mem
2 GiB 99328 KiB
4 GiB 157696 KiB
8 GiB 216064 KiB
16 GiB 274432 KiB
32 GiB 332800 KiB
48 GiB 367616 KiB
64 GiB 392192 KiB
80 GiB 410624 KiB
128 GiB 450560 KiB
160 GiB 468992 KiB
192 GiB 484352 KiB
256 GiB 508928 KiB
384 GiB 542720 KiB
432 GiB 552960 KiB
672 GiB 590848 KiB

max_prepared_transactions

属性
类别 资源使用情况/内存
说明 设置同时准备的事务数量上限。 运行副本服务器时,必须将此参数设置为与主服务器上的值相同或更高的值。
数据类型 integer
默认值 0
允许的值 0-262143
参数类型 static
文档 max_prepared_transactions

max_stack_depth

属性
类别 资源使用情况/内存
说明 设置最大堆栈深度(以 KB 为单位)。
数据类型 integer
默认值 2048
允许的值 2048
参数类型 (只读)
文档 max_stack_depth

shared_buffers

Attribute
类别 资源使用情况/内存
说明 设置服务器使用的共享内存缓冲区数。 单位为 8kb。 允许的值在 10% - 75% 的可用内存范围内。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 16-1073741823
参数类型 static
文档 shared_buffers

说明

shared_buffers 配置参数确定分配给 PostgreSQL 数据库用于缓冲数据的系统内存量。 它是可供所有数据库进程访问的集中式内存池。

需要数据时,数据库进程首先检查共享缓冲区。 如果存在所需的数据,会快速检索此数据,并绕过更耗时的磁盘读取。 共享缓冲区在数据库进程和磁盘之间充当中介,并有效地减少所需的 I/O 操作数。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 shared_buffers 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 shared_buffers 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 shared_buffers 参数的值。

对于内存最多 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 16384

对于超过 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 32768

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

shared_memory_type

属性
类别 资源使用情况/内存
说明 选择用于主共享内存区域的共享内存实现。
数据类型 枚举
默认值 mmap
允许的值 mmap
参数类型 (只读)
文档 shared_memory_type

temp_buffers

属性
类别 资源使用情况/内存
说明 设置每个数据库会话使用的临时缓冲区数量上限。
数据类型 integer
默认值 1024
允许的值 100-1073741823
参数类型 动态
文档 temp_buffers

work_mem

Attribute
类别 资源使用情况/内存
说明 设置写入到临时磁盘文件之前内部排序操作和哈希表要使用的内存量。
数据类型 integer
默认值 4096
允许的值 4096-2097151
参数类型 动态
文档 work_mem

说明

PostgreSQL 中的 work_mem 参数可控制在每个数据库会话的专用内存区域中为某些内部操作分配的内存量。 这些操作的示例包括排序和哈希处理。

与共享内存区域中的共享缓冲区不同,work_mem 是在每个会话或每个查询的专用内存空间中分配的。 通过设置足够的 work_mem 大小,可以显著提高这些操作的效率,并减少将临时数据写入磁盘的需求。

要点

  • 专用连接内存work_mem 是每个数据库会话使用的专用内存的一部分。 此内存不同于 shared_buffers 使用的共享内存区域。
  • 特定于查询的用法:并非所有会话或查询都使用 work_mem 简单的查询(例如 SELECT 1)不太可能需要 work_mem。 但是,涉及排序或哈希处理等操作的复杂查询可能使用 work_mem 的一个或多个区块。
  • 并行操作:对于跨多个并行后端的查询,每个后端可能会使用 work_mem 的一个或多个区块。

监视和调整 work_mem

必须持续监视系统性能,并根据需要调整 work_mem,主要是在与排序或哈希处理操作相关的查询执行时间缓慢时。 下面是使用 Azure 门户中提供的工具监视性能的方法:

  • 查询性能见解:查看“按临时文件数排名靠前的查询”选项卡,以确定生成临时文件的查询。 这种情况表明,可能需要增加 work_mem
  • 故障排除指南:使用故障排除指南中的“大量临时文件”选项卡来确定有问题的查询。
精细调整

在管理 work_mem 参数时,采用精细调整方法通常比设置全局值更高效。 此方法可确保根据进程和用户的特定需求明智地分配内存。 它还将遇到内存不足问题的风险降到最低。 下面是实现这一点的步骤:

  • 用户级别:如果特定用户主要涉及聚合或报告任务(内存密集型任务),请考虑自定义该用户的 work_mem 值。 使用 ALTER ROLE 命令提高用户操作的性能。

  • 函数/过程级别:如果特定函数或过程生成大量临时文件,那么增加特定函数或过程级别的 work_mem 值可能会有所帮助。 使用 ALTER FUNCTIONALTER PROCEDURE 命令专门为这些操作分配更多内存。

  • 数据库级别:如果只有特定数据库生成大量临时文件,请在数据库级别更改 work_mem

  • 全局级别:如果系统分析显示大多数查询生成小型临时文件,而只有少数查询创建大型临时文件,那么最好全局调高 work_mem 值。 此操作可促使在内存中处理大多数查询,这样就可避免基于磁盘的操作并提高效率。 但是,请始终谨慎操作并监视服务器上的内存利用率,确保它可处理增加的 work_mem 值。

确定排序操作的最小 work_mem 值

若要查找特定查询的最小 work_mem 值,尤其是在排序过程中生成临时磁盘文件的查询,请先考虑在查询执行期间生成的临时文件大小。 例如,如果一个查询生成一个 20 MB 的临时文件:

  1. 使用 psql 或偏好的 PostgreSQL 客户端连接到数据库。
  2. 设置略高于 20 MB 的初始 work_mem 值,以便在内存中处理时考虑到额外的标头。 使用 SET work_mem TO '25MB' 等命令。
  3. 在同一会话上对有问题的查询运行 EXPLAIN ANALYZE
  4. 查看 "Sort Method: quicksort Memory: xkB" 的输出。 如果指示 "external merge Disk: xkB",请以增量方式增加 work_mem 值并重新测试,直到出现 "quicksort Memory"。 出现 "quicksort Memory" 即表示查询现在内存中运行。
  5. 通过此方法确定值后,可以全局应用该值,也可在更精细的级别应用它(如上所述)来满足你的操作需求。

autovacuum_work_mem

属性
类别 资源使用情况/内存
说明 设置每个 autovacuum 工作进程要使用的最大内存。
数据类型 integer
默认值 -1
允许的值 -1-2097151
参数类型 动态
文档 autovacuum_work_mem

dynamic_shared_memory_type

属性
类别 资源使用情况/内存
说明 选择使用的动态共享内存实现。
数据类型 枚举
默认值 posix
允许的值 posix
参数类型 (只读)
文档 dynamic_shared_memory_type

huge_pages

Attribute
类别 资源使用情况/内存
说明 允许/禁止使用大型内存页。 此设置不适用于少于 4 个 vCore 的服务器。
数据类型 枚举
默认值 try
允许的值 on,off,try
参数类型 static
文档 huge_pages

说明

通过大型页面功能,可以在较大的块中管理内存。 通常可管理最大 2 MB 的块,而不是标准的 4 KB 页面。

使用大型页面可提供有效分流 CPU 的性能优势:

  • 它们减少了与内存管理任务相关的开销,例如更少的转换后备缓冲区 (TLB) 未命中。
  • 它们缩短了内存管理所需的时间。

具体来说,在 PostgreSQL 中,只能将大型页面用于共享内存区域。 共享内存区域的很大一部分分配给了共享缓冲区。

另一个优点是,大型页面可阻止将共享内存区域交换到磁盘,这进一步稳定了性能。

建议

  • 对于具有大量内存资源的服务器,请不要禁用大型页面。 禁用大型页面可能会损害性能。
  • 如果一开始使用不支持大型页面的较小服务器,但预计会纵向扩展到支持大型页面的服务器,那么请将 huge_pages 设置保留为 TRY,以保证无缝转换和最佳性能。

特定于 Azure 的注释

对于具有 4 个或更多 vCore 的服务器,会从基础操作系统自动分配大型页面。 此功能不适用于少于 4 个 vCore 的服务器。 如果更改了任何共享内存设置,则会自动调整大型页面数量,包括更改 shared_buffers

maintenance_work_mem

Attribute
类别 资源使用情况/内存
说明 设置用于维护操作(如 VACUUM、“创建索引”)的最大内存。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 1024-2097151
参数类型 动态
文档 maintenance_work_mem

说明

maintenance_work_mem 是 PostgreSQL 中的一个配置参数。 它可控制为维护操作(例如 VACUUMCREATE INDEXALTER TABLE)分配的内存量。 与影响查询操作内存分配的 work_mem 不同,maintenance_work_mem 是为维护和优化数据库结构的任务保留的。

要点

  • Vacuum 内存上限:如果想要通过增加 maintenance_work_mem 来更快地清理死元组,请注意,VACUUM 对于收集死元组标识符有内置限制。 对于此过程,只能使用最多 1 GB 的内存。
  • autovacuum 的内存分离:可以使用 autovacuum_work_mem 设置单独控制 autovacuum 操作使用的内存。 此设置充当 maintenance_work_mem 的子集。 你可以决定在不影响其他维护任务和数据定义操作的内存分配的情况下 autovacuum 使用的内存量。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 maintenance_work_mem 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 maintenance_work_mem 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 maintenance_work_mem 参数的值。

用于计算 maintenance_work_mem 的值的公式是 (long)(82.5 * ln(memoryGiB) + 40) * 1024

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 maintenance_work_mem
2 GiB 99328 KiB
4 GiB 157696 KiB
8 GiB 216064 KiB
16 GiB 274432 KiB
32 GiB 332800 KiB
48 GiB 367616 KiB
64 GiB 392192 KiB
80 GiB 410624 KiB
128 GiB 450560 KiB
160 GiB 468992 KiB
192 GiB 484352 KiB
256 GiB 508928 KiB
384 GiB 542720 KiB
432 GiB 552960 KiB
672 GiB 590848 KiB

max_prepared_transactions

属性
类别 资源使用情况/内存
说明 设置同时准备的事务数量上限。 运行副本服务器时,必须将此参数设置为与主服务器上的值相同或更高的值。
数据类型 integer
默认值 0
允许的值 0-262143
参数类型 static
文档 max_prepared_transactions

max_stack_depth

属性
类别 资源使用情况/内存
说明 设置最大堆栈深度(以 KB 为单位)。
数据类型 integer
默认值 2048
允许的值 2048
参数类型 (只读)
文档 max_stack_depth

shared_buffers

Attribute
类别 资源使用情况/内存
说明 设置服务器使用的共享内存缓冲区数。 单位为 8kb。 允许的值在 10% - 75% 的可用内存范围内。
数据类型 integer
默认值 取决于分配给服务器的资源(vCore、RAM 或磁盘空间)。
允许的值 16-1073741823
参数类型 static
文档 shared_buffers

说明

shared_buffers 配置参数确定分配给 PostgreSQL 数据库用于缓冲数据的系统内存量。 它是可供所有数据库进程访问的集中式内存池。

需要数据时,数据库进程首先检查共享缓冲区。 如果存在所需的数据,会快速检索此数据,并绕过更耗时的磁盘读取。 共享缓冲区在数据库进程和磁盘之间充当中介,并有效地减少所需的 I/O 操作数。

特定于 Azure 的注释

预配 Azure Database for PostgreSQL 灵活服务器的实例时,会根据为其计算选择的产品名称计算 shared_buffers 参数的默认值。 如果对支持该灵活服务器的计算进行任何后续产品选择更改,该实例的 shared_buffers 服务器参数的默认值不受任何影响。

每次更改分配给实例的产品时,还应根据以下公式中的值调整 shared_buffers 参数的值。

对于内存最多 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 16384

对于超过 2 GiB 的虚拟机,用于计算 shared_buffers 的值的公式是 memoryGib * 32768

根据上一个公式,下表列出了此服务器参数将设置为的值,具体取决于预配的内存量:

内存大小 shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

temp_buffers

属性
类别 资源使用情况/内存
说明 设置每个数据库会话使用的临时缓冲区数量上限。
数据类型 integer
默认值 1024
允许的值 100-1073741823
参数类型 动态
文档 temp_buffers

work_mem

Attribute
类别 资源使用情况/内存
说明 设置写入到临时磁盘文件之前内部排序操作和哈希表要使用的内存量。
数据类型 integer
默认值 4096
允许的值 4096-2097151
参数类型 动态
文档 work_mem

说明

PostgreSQL 中的 work_mem 参数可控制在每个数据库会话的专用内存区域中为某些内部操作分配的内存量。 这些操作的示例包括排序和哈希处理。

与共享内存区域中的共享缓冲区不同,work_mem 是在每个会话或每个查询的专用内存空间中分配的。 通过设置足够的 work_mem 大小,可以显著提高这些操作的效率,并减少将临时数据写入磁盘的需求。

要点

  • 专用连接内存work_mem 是每个数据库会话使用的专用内存的一部分。 此内存不同于 shared_buffers 使用的共享内存区域。
  • 特定于查询的用法:并非所有会话或查询都使用 work_mem 简单的查询(例如 SELECT 1)不太可能需要 work_mem。 但是,涉及排序或哈希处理等操作的复杂查询可能使用 work_mem 的一个或多个区块。
  • 并行操作:对于跨多个并行后端的查询,每个后端可能会使用 work_mem 的一个或多个区块。

监视和调整 work_mem

必须持续监视系统性能,并根据需要调整 work_mem,主要是在与排序或哈希处理操作相关的查询执行时间缓慢时。 下面是使用 Azure 门户中提供的工具监视性能的方法:

  • 查询性能见解:查看“按临时文件数排名靠前的查询”选项卡,以确定生成临时文件的查询。 这种情况表明,可能需要增加 work_mem
  • 故障排除指南:使用故障排除指南中的“大量临时文件”选项卡来确定有问题的查询。
精细调整

在管理 work_mem 参数时,采用精细调整方法通常比设置全局值更高效。 此方法可确保根据进程和用户的特定需求明智地分配内存。 它还将遇到内存不足问题的风险降到最低。 下面是实现这一点的步骤:

  • 用户级别:如果特定用户主要涉及聚合或报告任务(内存密集型任务),请考虑自定义该用户的 work_mem 值。 使用 ALTER ROLE 命令提高用户操作的性能。

  • 函数/过程级别:如果特定函数或过程生成大量临时文件,那么增加特定函数或过程级别的 work_mem 值可能会有所帮助。 使用 ALTER FUNCTIONALTER PROCEDURE 命令专门为这些操作分配更多内存。

  • 数据库级别:如果只有特定数据库生成大量临时文件,请在数据库级别更改 work_mem

  • 全局级别:如果系统分析显示大多数查询生成小型临时文件,而只有少数查询创建大型临时文件,那么最好全局调高 work_mem 值。 此操作可促使在内存中处理大多数查询,这样就可避免基于磁盘的操作并提高效率。 但是,请始终谨慎操作并监视服务器上的内存利用率,确保它可处理增加的 work_mem 值。

确定排序操作的最小 work_mem 值

若要查找特定查询的最小 work_mem 值,尤其是在排序过程中生成临时磁盘文件的查询,请先考虑在查询执行期间生成的临时文件大小。 例如,如果一个查询生成一个 20 MB 的临时文件:

  1. 使用 psql 或偏好的 PostgreSQL 客户端连接到数据库。
  2. 设置略高于 20 MB 的初始 work_mem 值,以便在内存中处理时考虑到额外的标头。 使用 SET work_mem TO '25MB' 等命令。
  3. 在同一会话上对有问题的查询运行 EXPLAIN ANALYZE
  4. 查看 "Sort Method: quicksort Memory: xkB" 的输出。 如果指示 "external merge Disk: xkB",请以增量方式增加 work_mem 值并重新测试,直到出现 "quicksort Memory"。 出现 "quicksort Memory" 即表示查询现在内存中运行。
  5. 通过此方法确定值后,可以全局应用该值,也可在更精细的级别应用它(如上所述)来满足你的操作需求。