weird interaction between asynchronous queries and pg_sleep

From: Merlin Moncure <mmoncure(at)gmail(dot)com>
To: PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: weird interaction between asynchronous queries and pg_sleep
Date: 2021-04-08 18:05:36
Message-ID: CAHyXU0y_NxPF0sdp56uZWe6e5GnQq7PwyN3GmKEYqswKh-p_mg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Consider the following snippet

create table data as select generate_series(1,1000000) s;

do $d$
begin
PERFORM * FROM dblink_connect('test','');

PERFORM * from dblink_send_query('test', 'SELECT * FROM data');

LOOP
if dblink_is_busy('test') = 0
THEN
PERFORM * FROM dblink_get_result('test') AS R(V int);
PERFORM * FROM dblink_get_result('test') AS R(V int);
RETURN;
END IF;

PERFORM pg_sleep(.001);
END LOOP;

PERFORM * FROM dblink_disconnect('test');
END;
$d$;

What's interesting here is that, when I vary the sleep parameter, I get:
0: .4 seconds (per top, this is busywait), same as running synchronous.
0.000001: 1.4 seconds
0.001: 2.4 seconds
0.01: 10.6 seconds
0.1: does not terminate

This effect is only noticeable when the remote query is returning
volumes of data. My question is, is there any way to sleep loop
client side without giving up 3x performance penalty? Why is that
that when more local sleep queries are executed, performance improves?

merlin

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Simon Riggs 2021-04-08 18:10:09 Re: VACUUM (DISABLE_PAGE_SKIPPING on)
Previous Message Andres Freund 2021-04-08 18:04:10 Re: test runner (was Re: SQL-standard function body)