【PGCCC】PostgreSQL 临时文件的使用

ops/2025/1/18 3:55:48/

临时文件

某些查询操作(例如sort或hash表)需要一些内存功能。此内存由运行时配置提供work_mem。
来自官方文档work_mem

work_mem (整数)

设置在写入临时磁盘文件之前查询操作(例如排序或哈希表)使用的基本最大内存量。
请注意,对于复杂查询,可能会并行运行多个排序或哈希操作;在开始将数据写入临时文件之前,通常允许每个操作使用此值指定的内存量。 排序操作用于
ORDER BY、DISTINCT 和合并连接。哈希表用于哈希连接、基于哈希的聚合、结果缓存节点和基于哈希的 IN 子查询处理。

一旦超过设置值work_mem,操作就会开始写入临时磁盘文件。

另一个可以写入临时文件的操作是CREATE INDEX。这由不同的运行时配置控制maintenance_work_mem。
来自官方文档maintenance_work_mem

Maintenance_work_mem(整数)

指定维护操作(例如 VACUUM、CREATE INDEX 和 ALTER TABLE ADD FOREIGN KEY)使用的最大内存量。

这些临时磁盘文件的具体写入位置由运行时配置控制,temp_tablespaces
同样来自官方文档temp_tablespaces

temp_tablespaces (字符串)

当 CREATE 命令未明确指定表空间时,此变量指定在其中创建临时对象(临时表和临时表上的索引)的表空间。这些表空间中还会创建用于排序大型数据集等目的的临时文件。
该值是表空间名称的列表。当列表中有多个名称时,PostgreSQL每次要创建临时对象时都会从列表中随机选择一个成员;但在事务中,连续创建的临时对象将放置在列表中连续的表空间中。如果列表中的选定元素是空字符串,PostgreSQL 将自动使用当前数据库的默认表空间。
当以temp_tablespaces交互方式设置时,指定不存在的表空间是错误的,指定用户没有 CREATE 权限的表空间也是如此。但是,当使用以前设置的值时,**不存在的表空间将被忽略,用户缺少 CREATE 权限的表空间也将被忽略。**具体来说,此规则适用于使用 中设置的值的情况postgresql.conf。
默认值为空字符串,这会导致所有临时对象都在当前数据库的默认表空间中创建。

默认表空间与特定临时表空间

ostgreSQL 的默认安装将默认表空间 ( pg_default ) 设置为temp_tablespaces。
您可能希望将实际数据的写入与临时文件分开,以改善磁盘 IO。这是temp_tablespaces最有用的地方。
此外,您可以将您的指向temp_tablespaces更快的磁盘,例如速度更快的 nvme。

为临时文件设置表空间

您可以使用以下示例代码来设置 temp_tablespaces

  • 创建新的表空间:
CREATE TABLESPACE temp LOCATION 'actual_location';
  • 设置集群范围temp_tablespaces
ALTER SYSTEM SET temp_tablespaces = 'temp';
SELECT pg_reload_conf();

临时文件的注意事项

  1. 当查询需要创建大量临时文件时,临时文件可能会耗尽可用的磁盘空间,PostgreSQL 会报告错误,例如 could not write block … of temporary file no space left on device …查询被取消。
  2. 临时文件仅在查询期间保留。查询完成或取消后,临时文件将被清除。DBA 偶尔会遇到(1),当他们检查磁盘使用情况时,他们会发现仍有空间,并开始排除故障以找出问题所在。该问题在 (2)中描述。发生这种情况时,可能是时候优化查询了。另一种解决方法是使用更大的可用磁盘作为temp_tablespaces.

监控临时文件的使用情况

我们可以借助运行时配置log_temp_files来记录临时文件

log_temp_files (integer)
控制临时文件名和大小的日志记录。可以为排序、哈希和临时查询结果创建临时文件。如果通过此设置启用,则在删除每个临时文件时都会发出一个日志条目。零值记录所有临时文件信息,而正值仅记录大小大于或等于指定数据量的文件。如果指定此值时没有单位,则以千字节为单位。默认设置为 -1,禁用此类日志记录。只有超级用户可以更改此设置。

虽然log_temp_files在删除临时文件时会记录有关临时文件的信息,但您可能还想在创建临时文件时对其进行监控,密切关注。
此外,您可能想知道哪些查询正在使用临时文件,并可能优化它们以加快速度work_mem。

我们将通过 SQL 执行此操作。
查询:

WITH tablespaces AS (SELECTspcname AS tbl_name,coalesce(nullif(pg_tablespace_location(oid), ''), (current_setting('data_directory') || '/base')) AS tbl_locationFROM pg_tablespace
),
tablespace_suffix AS (SELECTtbl_name,tbl_location || '/pgsql_tmp' AS pathFROM tablespacesWHERE tbl_name = 'pg_default'UNION ALLSELECTtbl_name,tbl_location || '/' || path || '/pgsql_tmp'FROM tablespaces, LATERAL pg_ls_dir(tbl_location) AS pathWHERE path ~ ('PG_' || substring(current_setting('server_version') FROM '^(?:\d\.\d\d?|\d+)'))
),
stat AS (SELECTsubstring(file from '\d+\d') AS pid,tbl_name AS temp_tablespace,pg_size_pretty(sum(pg_size_bytes(size))) AS sizeFROM tablespace_suffix, LATERAL pg_ls_dir(path, true, false) AS file,LATERAL pg_size_pretty((pg_stat_file(path || '/' || file, true)).size) AS sizeGROUP BY pid, temp_tablespace
)
SELECTa.datname,a.pid,coalesce(size, '0 MB') AS temp_size_written,coalesce(temp_tablespace, 'not using temp files') AS temp_tablespace,a.application_name,a.client_addr,a.usename,(clock_timestamp() - a.query_start)::interval(0) AS duration,(clock_timestamp() - a.state_change)::interval(0) AS duration_since_state_change,trim(trailing ';' FROM left(query, 1000)) AS query,a.state,a.wait_event_type || ':' || a.wait_event AS wait
FROM pg_stat_activity AS a
LEFT JOIN stat ON a.pid = stat.pid::int
WHERE a.pid != pg_backend_pid()
ORDER BY temp_size_written DESC;

示例输出:

datname | pid  | temp_size_written |   temp_tablespace    | application_name | client_addr | usename | duration | duration_since_state_change |                        query                        | state  |             wait
---------+------+-------------------+----------------------+------------------+-------------+---------+----------+-----------------------------+-----------------------------------------------------+--------+------------------------------bolaji  | 4943 | 1911 MB           | temp                 | bolaji-psql      | <null>      | bolaji  | 00:00:51 | 00:00:51                    | CREATE INDEX CONCURRENTLY ON folder (id)            | active | <null>bolaji  | 7518 | 1338 MB           | pg_default           | bolaji-psql      | <null>      | bolaji  | 00:00:48 | 00:00:48                    | select generate_series(1,100000000) as a order by a | active | <null><null>  | 3819 | 0 MB              | not using temp files |                  | <null>      | <null>  | <null>   | <null>                      |                                                     | <null> | Activity:AutoVacuumMain<null>  | 3818 | 0 MB              | not using temp files |                  | <null>      | <null>  | <null>   | <null>                      |                                                     | <null> | Activity:WalWriterMain<null>  | 3816 | 0 MB              | not using temp files |                  | <null>      | <null>  | <null>   | <null>                      |                                                     | <null> | Activity:CheckpointerMain<null>  | 3821 | 0 MB              | not using temp files |                  | <null>      | bolaji  | <null>   | <null>                      |                                                     | <null> | Activity:LogicalLauncherMainbolaji  | 5935 | 0 MB              | not using temp files | bolaji-psql      | <null>      | bolaji  | 00:31:39 | 00:31:39                    | show work_mem                                       | idle   | Client:ClientRead<null>  | 3817 | 0 MB              | not using temp files |                  | <null>      | <null>  | <null>   | <null>                      |                                                     | <null> | Activity:BgWriterHibernate
(8 rows)Time: 2.960 ms

最后,从 PG12 开始,有一个新函数pg_ls_tmpdir可用。我决定不在上述查询中使用这个函数,因为它在较低版本中不可用。
#PG证书#PG考试#PostgreSQL培训#PostgreSQL考试#PostgreSQL认证


http://www.ppmy.cn/ops/150987.html

相关文章

C# OpenCV机器视觉:图片去水印

阿强是个不折不扣的动漫迷&#xff0c;最近他疯狂迷上了一部超火的老动漫&#xff0c;每天茶不思饭不想&#xff0c;心心念念就盼着能多看几集。然而&#xff0c;他在网上找到的资源却像是调皮孩子脸上的脏手印&#xff0c;布满了各种乱七八糟的水印&#xff0c;这可把阿强给郁…

HTTPS与HTTP:区别及安全性对比

目录 一、基础概念 二、安全性对比 1. 加密传输 2. 身份验证 3. 数据完整性 4. 端口 5. 浏览器展示方式 三、使用场景与性能 1. 使用场景 2. 性能开销 四、成本与维护 五、搜索引擎优化&#xff08;SEO&#xff09; 六、案例分析 七、隐私保护与中间人攻击 八、…

Debian没有reboot命令记录

在安装服务并按照官方推荐的方式安装 Debian 系统时&#xff0c;发现无法使用 reboot 命令。经过一番排查&#xff0c;发现问题的根源在于系统环境变量中未包含常用命令所在的路径。具体来说&#xff0c;/sbin/ 和 /usr/sbin/ 目录通常包含系统管理命令&#xff0c;而这些路径默…

高级Python Web开发:FastAPI的前后端集成与API性能优化

高级Python Web开发&#xff1a;FastAPI的前后端集成与API性能优化 目录 &#x1f6e0;️ 前后端集成的基本原理与实践&#x1f680; FastAPI的API设计与实现&#x1f4c8; API性能测试与负载测试 &#x1f4ca; 使用Locust进行API性能测试&#x1f4a5; 使用Apache JMeter进…

智汇云舟参编《城市轨道交通安全防范系统技术要求》国标正式发布

近日&#xff0c;根据国家标准化管理委员会官网&#xff0c;全国标准信息公共服务平台发布的公告&#xff0c;国家标准《城市轨道交通安全防范系统技术要求》&#xff08;GB/T 26718-2024&#xff09;已由全国城市轨道交通标准化技术委员会上报国家标准化管理委员会&#xff0c…

k8s部署jumpserver4.0.2

k8s部署allinone方式部署jumpserver4.0.2 一、准备工作 版本信息介绍&#xff1a; jumpserver&#xff1a;allinone 4.0.2 postgresql&#xff1a;12.20 1.1、官网文档 https://github.com/jumpserver/Dockerfile/tree/master/allinone 1.2、部署数据库 docker run --nam…

【matlab】matlab知识点及HTTP、TCP通信

1、矩阵运算 点乘&#xff1a;对于两个同维度的向量&#xff0c;点乘结果是这两个向量对应分量的乘积之和。 点除&#xff1a;是指对两个数组的对应元素进行除法运算。 点幂&#xff1a;表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…

kalilinux - 目录扫描之dirsearch

情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站&#xff0c;例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考&#xff0c;我们只指导https://www.example.com/ 但不知道它下面有什么文件&#xff0c;文…