PostgreSQL 13.7

我在所有PostgreSQL服务器上的数据库Postgres中有pg_stat_Statements扩展名.

PMM-代理每分钟向此扩展发出请求:

SELECT /* pmm-agent:pgstatstatements */ pg_stat_statements.userid, pg_stat_statements.dbid, pg_stat_statements.queryid, pg_stat_statements.query, pg_stat_statements.calls, pg_stat_statements.total_exec_time, pg_stat_statements.rows, pg_stat_statements.shared_blks_hit, pg_stat_statements.shared_blks_read, pg_stat_statements.shared_blks_dirtied, pg_stat_statements.shared_blks_written, pg_stat_statements.local_blks_hit, pg_stat_statements.local_blks_read, pg_stat_statements.local_blks_dirtied, pg_stat_statements.local_blks_written, pg_stat_statements.temp_blks_read, pg_stat_statements.temp_blks_written, pg_stat_statements.blk_read_time, pg_stat_statements.blk_write_time FROM pg_stat_statements WHERE queryid IS NOT NULL AND query IS NOT NULL

在我的一台服务器上,此请求导致临时文件使用.

EXPLAIN (ANALYZE, BUFFERS, SETTINGS)
"Function Scan on pg_stat_statements  (cost=0.00..10.00 rows=990 width=168) (actual time=1068.291..1207.841 rows=3401 loops=1)"
"  Filter: ((queryid IS NOT NULL) AND (query IS NOT NULL))"
"  Buffers: temp read=30382 written=30382"
"Settings: effective_cache_size = '24GB', effective_io_concurrency = '200', max_parallel_workers = '12', max_parallel_workers_per_gather = '6', random_page_cost = '1.1', temp_buffers = '16MB', work_mem = '40MB'"
"Planning:"
"  Buffers: shared hit=6"
"Planning Time: 0.153 ms"
"Execution Time: 1244.587 ms"

temp files usage

在另一台服务器上,此查询的EXECUTION_PLAN是正常的,例如:

"Function Scan on pg_stat_statements  (cost=0.00..10.00 rows=990 width=168) (actual time=0.939..1.064 rows=364 loops=1)"
"  Filter: ((queryid IS NOT NULL) AND (query IS NOT NULL))"
"Settings: cpu_index_tuple_cost = '0.0005', effective_cache_size = '16GB', effective_io_concurrency = '200', max_parallel_workers = '10', max_parallel_workers_per_gather = '6', parallel_tuple_cost = '0.05', random_page_cost = '1.1', temp_buffers = '16MB', work_mem = '153MB'"
"Planning:"
"  Buffers: shared hit=6"
"Planning Time: 0.140 ms"
"Execution Time: 2.224 ms"

查询中没有排序或联接,为什么使用临时文件?

将work_mem增加到300MB并不能解决问题.

推荐答案

从执行计划中可以看到,此视图是使用函数定义的.现在,PostgreSQL在名为"tuple store"的数据 struct 中收集函数结果.只要元组存储适合work_mem,它就保存在RAM中.如果超过该大小,则会将其假脱机到临时文件.

因此,要么在第一种情况下有更多的数据(pg_stat_statements.max的值更高,或者语句有更多的文本),要么在第二种情况下work_mem更小.

Postgresql相关问答推荐

在插入时创建一个触发器,在PostgreSQL中的另一个表上创建另一个触发器

postgresql中多个左连接的空结果

错误:分区表的唯一约束必须包括所有分区列

PL/pgSQL 中 PL/SQL %ISOPEN 的类似功能是什么?

Postgres 14 反斜杠 Z 没有给出正确的输出

如何计算过滤器中的百分比

如何在 postgresql 中创建一个空的 JSON 对象?

使用 ON CONFLICT 从 INSERT 返回行,无需更新

Rails 重置所有 Postgres 序列?

Rails 4查询由单个属性唯一

当记录包含 json 或字符串的混合时,如何防止 Postgres 中的invalid input syntax for type json

Select 中的 PostgreSQL 正则表达式捕获组

NOT LIKE 带有 NULL 值的行为

如何将主键添加到视图?

PG::ConnectionBad FATAL:role "Myname" does not exist

有没有办法确保 WHERE 子句在 DISTINCT 之后发生?

如何在 redshift 中对字段进行 GROUP BY 和 CONCATENATE

查询 JSON 列中的数组元素

postgres regexp_replace 只想允许 a-z 和 A-Z

基于秒的 Postgresql 日期差异