| From: | Nazir Bilal Yavuz <byavuz81(at)gmail(dot)com> |
|---|---|
| To: | Yuhang Qiu <iamqyh(at)gmail(dot)com> |
| Cc: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
| Subject: | Re: [PATCH] Use streaming read I/O in sample scans |
| Date: | 2026-08-28 08:16:15 |
| Message-ID: | CAN55FZ3c+07J5CWCyBGARTUQzNKHFdtxcRTyaEjWzcou=2KttQ@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi,
Here is rest of my review from [1].
On Wed, 26 Aug 2026 at 16:46, Yuhang Qiu <iamqyh(at)gmail(dot)com> wrote:
>
> `SYSTEM_TIME` needs some explanation. It currently checks the time only
> in `NextSampleBlock()`, so the existing implementation is not a strict
> time limit and may exceed the requested time while processing the
> current page. A ReadStream may request a limited number of blocks in
> advance, so the deviation can grow to the look-ahead window. This patch
> does not add special handling for `SYSTEM_TIME`.
I believe we need to change the documentation at least, since it
mentions: 'maximum number of milliseconds to spend reading the table'.
You can perhaps disable read-streams and fall back to the original
method. Alternatively, you can create a read-stream flag to block
look-ahead distance increases, but I think that doesn't make sense
since it contradicts how read streams work.
Code review:
0002:
Other than the SYSTEM_TIME point above, the code looks good to me. As
mentioned in [1], I would move the `heapam.c` changes to 0001 and
submit that patch separately as an independent bug fix.
0003: LGTM.
> Besides SampleScan, I found several paths that still read blocks one at
> a time without using ReadStream:
>
> - `ProcessSingleRelationFork()` while enabling online checksums;
There is already a thread for this:
https://postgr.es/m/tencent_9D2274B5F0ABB631C546C61D6FE120DB4E05%40qq.com
> - `log_newpage_range()`, which reads a block range while generating WAL;
That would make sense.
> - exact heap and index scans in pgstattuple;
pgstat_btree_page(), pgstat_hash_page(), and pgstat_gist_page() each
read one page, but pgstat_index() calls them while scanning every
index block. I think pgstat_index() can be refactored to use
read-streams.
> - nbtree and GIN verification in amcheck;
These seem very complicated to streamify. I am not sure if the effort
will pay off.
> - index-driven heap fetch, which has also been discussed separately [2].
I don't have an opinion on this.
> There is also a broader question. Some in-core pathes and many external
> extensions still call `ReadBuffer()` directly, and some higher-level
> workloads have predictable block access patterns that are not exposed to
> the buffer manager. Adapting individual core paths cannot cover all of
> these cases.
>
> It may be worth discussing whether DIO needs a more general heuristic
> read-ahead mechanism. If there is interest, I can start a separate thread.
> That is outside the scope of this patch.
We must use AIO and DIO together; otherwise, DIO without AIO will
perform badly. And to use AIO for reads, read-streams are the general
solution instead of using AIO's own functions. Could you please
explain your idea in more detail?
[1] https://postgr.es/m/CAN55FZ3Lik2m9J%2BEQjzEHSMSBNgAXU5Myt8LFg%3DD2OQ0i_jUMQ%40mail.gmail.com
--
Regards,
Nazir Bilal Yavuz
Microsoft
| From | Date | Subject | |
|---|---|---|---|
| Next Message | JoongHyuk Shin | 2026-08-28 08:17:25 | Re: Deadlock detector fails to activate on a hot standby replica |
| Previous Message | Nikhil Sontakke | 2026-08-28 08:15:59 | Re: [PATCH] Fix JSON_SERIALIZE() coercion placeholder type for jsonb input |