Daniel Westermann wrote:
> question: Given these steps:
> 
> 
> postgres=# explain (analyze,buffers,costs off) select a from t1 where b = 5;
>                                 QUERY PLAN                                
> --------------------------------------------------------------------------
>  Index Only Scan using i2 on t1 (actual time=0.056..0.058 rows=1 loops=1)
>    Index Cond: (b = 5)
>    Heap Fetches: 0
>    Buffers: shared hit=4
>  Planning time: 0.421 ms
>  Execution time: 0.111 ms
> (6 rows)
> 
> postgres=# update t1 set a = 30 where b = 5;
> UPDATE 1
> postgres=# explain (analyze,buffers,costs off) select a from t1 where b = 5;
>                                 QUERY PLAN                                
> --------------------------------------------------------------------------
>  Index Only Scan using i2 on t1 (actual time=0.039..0.042 rows=1 loops=1)
>    Index Cond: (b = 5)
>    Heap Fetches: 2
>    Buffers: shared hit=5
>  Planning time: 0.176 ms
>  Execution time: 0.082 ms
> 
> The 2 heap fetches for the second run are clear to me, because of the pointer 
> from the old version of the row to the new one. But why does the next 
> execution only need one heap fetch?
> 
> 
> postgres=# explain (analyze,buffers,costs off) select a from t1 where b = 5;
>                                 QUERY PLAN                                
> --------------------------------------------------------------------------
>  Index Only Scan using i2 on t1 (actual time=0.046..0.049 rows=1 loops=1)
>    Index Cond: (b = 5)
>    Heap Fetches: 1
>    Buffers: shared hit=5
>  Planning time: 0.194 ms
>  Execution time: 0.097 ms
> 
> Is that because of some sort of caching?

I'd say the old index tuple was killed during the first scan:
https://www.cybertec-postgresql.com/en/killed-index-tuples/

Yours,
Laurenz Albe
-- 
Cybertec | https://www.cybertec-postgresql.com


Reply via email to