Thread: EXPLAIN BUFFERS: dirtied

EXPLAIN BUFFERS: dirtied

From
Vitaliy Garnashevich
Date:
Hi,

In EXPLAIN (ANALYZE, BUFFERS) for a SELECT query, I see the following 
statistics under an Index Scan node:

Buffers: shared hit=8357288 read=6165444 dirtied=44820 written=5590

As far as I understand, that's the statistics for accesses to shared 
buffers during the query:
- hit = required page was already in shared buffers
- read = required page was not in shared buffers, and was loaded from 
disk (from filesystem cache)
- written = while loading the required page, there was no free space for 
it in shared buffers, so some other dirty page was evicted from shared 
buffers and was written to disk (to filesystem cache), to free some 
space and to load the required page

But what is "dirtied" statistics? When a SELECT query could make pages 
dirty?

Regards,
Vitaliy



Re: EXPLAIN BUFFERS: dirtied

From
Tom Lane
Date:
Vitaliy Garnashevich <vgarnashevich@gmail.com> writes:
> But what is "dirtied" statistics? When a SELECT query could make pages 
> dirty?

Setting hint bits on recently-committed rows.

            regards, tom lane


Re: EXPLAIN BUFFERS: dirtied

From
Vitaliy Garnashevich
Date:
I've read this article: https://wiki.postgresql.org/wiki/Hint_Bits

It says:

> A plain SELECT, count(*), or VACUUM on the entire table will check 
> every tuple for visibility and set its hint bits. 

Suppose, a new page was created using many INSERTs, and then was written 
to disk during a checkpoint. There were no SELECTs or VACUUM on the page 
or table yet. Will the following SELECT of one tuple from the page 
update hint bits for ALL tuples on the page? Is that correct?

When a page is initially created and then is being written to disk 
during a checkpoint, does checkpoint writer update the hint bits before 
writing the page, or the following SELECT/VACUUM will have to do that 
(possibly loading/updating/writing the page again)?

Regards,
Vitaliy

On 2018-01-29 20:38, Tom Lane wrote:
> Vitaliy Garnashevich <vgarnashevich@gmail.com> writes:
>> But what is "dirtied" statistics? When a SELECT query could make pages
>> dirty?
> Setting hint bits on recently-committed rows.
>
>             regards, tom lane
>



Re: EXPLAIN BUFFERS: dirtied

From
Tomas Vondra
Date:

On 01/29/2018 08:21 PM, Vitaliy Garnashevich wrote:
> I've read this article: https://wiki.postgresql.org/wiki/Hint_Bits
> 
> It says:
> 
>> A plain SELECT, count(*), or VACUUM on the entire table will check
>> every tuple for visibility and set its hint bits. 
> 
> Suppose, a new page was created using many INSERTs, and then was written
> to disk during a checkpoint. There were no SELECTs or VACUUM on the page
> or table yet. Will the following SELECT of one tuple from the page
> update hint bits for ALL tuples on the page? Is that correct?
> 

Possibly, if there are no old transactions running.

> When a page is initially created and then is being written to disk
> during a checkpoint, does checkpoint writer update the hint bits before
> writing the page, or the following SELECT/VACUUM will have to do that
> (possibly loading/updating/writing the page again)?
> 

Checkpoint only deals with 8kB chunks of data. Hint bits are not set on
a page, but on individual items (rows), so it's not up to the checkpoint
process to tweak that - that's up to queries accessing the data.

regards

-- 
Tomas Vondra                  http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


Re: EXPLAIN BUFFERS: dirtied

From
Vitaliy Garnashevich
Date:
Thanks!