为什么吐司桌不影响expain(分析)?

时间:2016-10-19 08:54:48

标签: postgresql

这是表结构

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执行其余的查询,但保持“头脑”以获取执行的统计细节?

如果有人可以确认或解释它为何会发生。

1 个答案:

答案 0 :(得分:1)

我不知道为什么选择这样做,但我想这是PostgreSQL尝试尽可能延迟取消值的副作用。

你可以强制PostgreSQL将其作为查询执行的一部分进行解密,这样你就可以获得更真实的数据:

EXPLAIN (ANALYZE, BUFFERS, TIMING) SELECT length(a2) FROM test;