这是表结构
create table test as
select
lpad('x',100,'x') as a1,
(SELECT array_to_string(ARRAY(SELECT chr((65 + round(random() * 25)):: int) FROM generate_series(1,1024*1024)), '')) as a2
from generate_series(1,5*1024);
表770Kb的总大小加上吐司表5.8Gb
让我们跑吧
explain (analyze, buffers, timing) select a2 from test
"Seq Scan on t1 (cost=0.00..145.20 rows=5120 width=18) (actual time=0.041..2.959 rows=5120 loops=1)"
"Buffers: shared hit=2 read=92"
"Planning time: 1.771 ms"
"Execution time: 3.375 ms"
这意味着不扫描toast表。这就是解释结果与真实查询不匹配的原因。
我想,这是一个规划优化问题。没有数据消费者,不需要阅读它们。但是解释的结果,假设匹配(至少在大约时间上)到实际查询。
关键词解释,分析,缓冲语法的一部分,它们是否被插入到由postgres查询解析器构建的AST中?或者它们是从查询中删除而postgres执行其余的查询,但保持“头脑”以获取执行的统计细节?
如果有人可以确认或解释它为何会发生。
答案 0 :(得分:1)
我不知道为什么选择这样做,但我想这是PostgreSQL尝试尽可能延迟取消值的副作用。
你可以强制PostgreSQL将其作为查询执行的一部分进行解密,这样你就可以获得更真实的数据:
EXPLAIN (ANALYZE, BUFFERS, TIMING) SELECT length(a2) FROM test;