On Sat, Jan 17, 2015 at 10:09 AM, Robert Haas <robertmh...@gmail.com> wrote: > On Fri, Jan 16, 2015 at 11:27 PM, Amit Kapila <amit.kapil...@gmail.com> wrote: > > Assuming we will increment next_prefetch_block only after prefetching > > blocks (equivalent to prefetch_increment), won't 2 workers can > > simultaneously see the same value for next_prefetch_block and try to > > perform prefetch for same blocks? > > The idea is that you can only examine and modify next_prefetch_block > or next_scan_block while holding the mutex. > > > What will be value of prefetch_increment? > > Will it be equal to prefetch_distance or prefetch_distance/2 or > > prefetch_distance/4 or .. or will it be totally unrelated to > > prefetch_distance? > > I dunno, that might take some experimentation. prefetch_distance/2 > doesn't sound stupid. >
Okay, I think I got the idea what you want to achieve via prefetching. So assuming prefetch_distance = 100 and prefetch_increment = 50 (prefetch_distance /2), it seems to me that as soon as there are less than 100 blocks in prefetch quota, it will fetch next 50 blocks which means the system will be always approximately 50 blocks ahead, that will ensure that in this algorithm it will always perform sequential scan, however eventually this is turning to be a system where one worker is reading from disk and then other workers are reading from OS buffers to shared buffers and then getting the tuple. In this approach only one downside I can see and that is there could be times during execution where some/all workers will have to wait on the worker doing prefetching, however I think we should try this approach and see how it works. Another thing is that I think prefetching is not supported on all platforms (Windows) and for such systems as per above algorithm we need to rely on block-by-block method. With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com