PostgreSQL 中的内存调整

postgresql.conf 中的设置

为方便将大量数据加载到 PostgreSQL 数据库中,可能需要增大 postgresql.conf 文件中的 shared_buffers 值和 max_locks_per_transaction 值。

shared_buffers

参数 shared_buffers 用于指定共享内存缓冲区所占用的内存量。PostgreSQL 文档指出,出于对性能的考虑,所用的设置可能需要大于最小值 128 KB 要大,或者是 max_connections 的设置值的 16 倍。对于生产装置,建议将 shared_buffers 设置为使用几十兆字节。

当加载大量数据时,您很可能需要将 shared_buffers 设置为大于默认值 32 MB。更改了 postgresql.conf 文件中的此参数后,必须重新启动数据库群集。

max_locks_per_transaction

max_locks_per_transaction 值指示可以同时锁定的数据库对象的数量。大多数情况下,默认值 64 即可满足需求。但是,当一次性加载大量数据集(例如,几千个)时,事务的并行对象锁定数量可超过 64 个。

并发锁定与数据集数量之间并不是一对一的关系,也就是说,如果您要加载 3,000 个数据集,并不需要将 max_locks_per_transaction 增加到 3,000。在进行批量加载前,取消 max_locks_per_transaction 属性的注释并将其值增加到 100 即可。

如果更改参数 max_locks_per_transaction 的值,必须重新启动服务器。

增加以上任一参数的值都有可能导致数据库所需的共享内存大于操作系统的可用内存。有关如何增加操作系统共享内存设置的信息,请参阅 PostgreSQL 文档中的“管理内核资源”。

cursor_tuple_fraction

PostgreSQL 规划器使用 cursor_tuple_fraction 值来估算需要哪部分由查询返回的行。默认情况下,cursor_tuple_fraction 在 postgresql.conf 文件中设置为 0.1,这表示结果集中前 10% 的行(或要素)将很快返回,而其余部分的行则需要更长时间才能返回。

如果想要更改连接到非 ArcGIS 应用程序时 PostgreSQL 规划器所显示的结果集百分比,可以在 postgresql.conf 文件中更改 cursor_tuple_fraction 属性的值。

使用 ArcGIS 10.2 或更高版本查询数据时,将始终使用 cursor_tuple_fraction 为 1.0 的设置,这意味着结果集 100% 返回后才会显示数据。通过 ArcGIS 访问数据库时,在 postgresql.conf 文件中更改 cursor_tuple_fraction 的值将不适用。要更改 ArcGIS 使用的值,必须针对会话或系统设置 cursor_tuple_fraction 环境变量。

提高第三方 SQL 空间查询性能

如果将系统环境变量 ST_GEOMETRY_OUTPUT_FORMAT 设置为输出到 ST_Geometry 类型,而不是扩展的熟知文本 (WKT) 表示,则在 ArcGIS 外部执行从业务表返回 ST_Geometry 空间列的 SQL 查询时,可以提高查询性能。

默认情况下,ST_GEOMETRY_OUTPUT_FORMAT 被设置为 ST_GEOMETRY,这意味着将返回十六进制表示。创建可用的地理数据库备份时需要该设置。如果想提高 SQL 查询的性能,可将此变量更改为 TYPE。如果因为需要执行大量的空间 SQL 查询而设置此变量,请确保在查询完成后将其删除,然后重新启动 PostgreSQL 数据库群集。

应在运行 PostgreSQL 的计算机上设置此变量。

对于 Linux OS,为要发出 SQL 查询的 shell 设置此变量。对于 bash shell,其语法如下:

ST_GEOMETRY_OUTPUT_FORMAT=TYPE

对于 csh shell,其语法为:

setenv ST_GEOMETRY_OUTPUT_FORMAT TYPE

在 Windows 上,将在系统属性中创建一个系统环境变量。

变量名称:ST_GEOMETRY_OUTPUT_FORMAT

变量值:TYPE

设置了该变量后,必须重新启动 PostgreSQL 数据库群集。

5/10/2014