On 19/01/2024 2:35 pm, Tomas Vondra wrote:
On 1/19/24 09:34, Konstantin Knizhnik wrote:
On 18/01/2024 6:00 pm, Tomas Vondra wrote:
On 1/17/24 09:45, Konstantin Knizhnik wrote:
I have integrated your prefetch patch in Neon and it actually works!
Moreover, I combined it with prefetch of leaf pages for IOS and it also
seems to work.
Cool! And do you think this is the right design/way to do this?
I like the idea of prefetching TIDs in executor.
But looking though your patch I have some questions:
1. Why it is necessary to allocate and store all_visible flag in data
buffer. Why caller of IndexPrefetchNext can not look at prefetch field?
+ /* store the all_visible flag in the private part of the entry */
+ entry->data = palloc(sizeof(bool));
+ *(bool *) entry->data = all_visible;
What you mean by "prefetch field"?
I mean "prefetch" field of IndexPrefetchEntry:
+
+typedef struct IndexPrefetchEntry
+{
+ ItemPointerData tid;
+
+ /* should we prefetch heap page for this TID? */
+ bool prefetch;
+
You store the same flag twice:
+ /* prefetch only if not all visible */
+ entry->prefetch = !all_visible;
+
+ /* store the all_visible flag in the private part of the entry */
+ entry->data = palloc(sizeof(bool));
+ *(bool *) entry->data = all_visible;
My question was: why do we need to allocate something in entry->data and
store all_visible in it, while we already stored !all-visible in
entry->prefetch.