Hi, 

PostgreSQL 9.6.2 on CentOS 7.3 x64. 

This is my data set: 

drop table if exists users; 
drop table if exists ids; 
create table users ( user_id int 
, username varchar(50) 
); 
with generator as 
( select a.* 
from generate_series (1,3000000) a 
order by random() 
) 
insert into users ( user_id 
, username 
) 
select a 
, md5(a::varchar) 
from generator; 
create unique index i_users on users ( user_id ); 
create table ids ( id int ); 
insert into ids (id) values ( generate_series ( 2500000, 3500000 ) ); 
create unique index i_ids on ids ( id ); 
analyze users; 
analyze ids; 

I have set work_mem to a very low value intentionally for demonstration 
purposes: 

postgres=# show work_mem; 
work_mem 
---------- 
16MB 
(1 row) 

postgres=# show shared_buffers ; 
shared_buffers 
---------------- 
128MB 
(1 row) 


When I run the following query ( I know that "not in" is not a good choice here 
): 

postgres=# select count(user_id) from users where user_id not in ( select id 
from ids); 

... this seems to never complete (at least not within one hour). 

Setting work_mem to 32MB and all is fine. 

top shows the session at 100% CPU. No waits are listed in pg_stat_activity: 

postgres=# select pid,wait_event_type,wait_event,state,query from 
pg_stat_activity ; 
pid | wait_event_type | wait_event | state | query 
-------+-----------------+------------+--------+------------------------------------------------------------------------------
 
17817 | | | active | select count(user_id) from users where user_id not in ( 
select id from ids); 
17847 | | | active | select pid,wait_event_type,wait_event,state,query from 
pg_stat_activity ; 
(2 rows) 

strace shows more ore less always this, so something is happening: 

read(14, 
"\0\0\1\0\0\t\30\0\351G1\0\16\0\0\0\1\0\0\t\30\0\352G1\0\16\0\0\0\1\0"..., 
8192) = 8192 
read(14, 
"\1\0\0\t\30\0002J1\0\16\0\0\0\1\0\0\t\30\0003J1\0\16\0\0\0\1\0\0\t"..., 8192) 
= 8192 
read(14, "\0\t\30\0{L1\0\16\0\0\0\1\0\0\t\30\0|L1\0\16\0\0\0\1\0\0\t\30\0"..., 
8192) = 8192 
read(14, 
"\30\0\304N1\0\16\0\0\0\1\0\0\t\30\0\305N1\0\16\0\0\0\1\0\0\t\30\0\306N"..., 
8192) = 8192 
read(14, "\rQ1\0\16\0\0\0\1\0\0\t\30\0\16Q1\0\16\0\0\0\1\0\0\t\30\0\17Q1\0"..., 
8192) = 8192^C 

postgres@pgbox:/u02/pgdata/PG962/ [PG962] ls -la /proc/17817/fd/ 
total 0 
dr-x------. 2 postgres postgres 0 Apr 4 14:45 . 
dr-xr-xr-x. 9 postgres postgres 0 Apr 4 14:34 .. 
lr-x------. 1 postgres postgres 64 Apr 4 14:45 0 -> /dev/null 
l-wx------. 1 postgres postgres 64 Apr 4 14:45 1 -> pipe:[58121] 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 10 -> socket:[58881] 
lr-x------. 1 postgres postgres 64 Apr 4 14:45 11 -> pipe:[58882] 
l-wx------. 1 postgres postgres 64 Apr 4 14:45 12 -> pipe:[58882] 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 13 -> 
/u02/pgdata/PG962/base/13323/16516 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 14 -> 
/u02/pgdata/PG962/base/pgsql_tmp/pgsql_tmp17817.1 
l-wx------. 1 postgres postgres 64 Apr 4 14:45 2 -> pipe:[58121] 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 3 -> anon_inode:[eventpoll] 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 4 -> 
/u02/pgdata/PG962/base/13323/2601 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 5 -> 
/u02/pgdata/PG962/base/13323/16517 
lr-x------. 1 postgres postgres 64 Apr 4 14:45 6 -> pipe:[58120] 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 7 -> 
/u02/pgdata/PG962/base/13323/16520 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 8 -> 
/u02/pgdata/PG962/base/13323/16513 
lrwx------. 1 postgres postgres 64 Apr 4 14:45 9 -> socket:[58126] 

The size of the temp file does not change over time: 

postgres@pgbox:/u02/pgdata/PG962/ [PG962] ls -lha 
/u02/pgdata/PG962/base/pgsql_tmp/pgsql_tmp17817.2 
-rw-------. 1 postgres postgres 14M Apr 4 14:48 
/u02/pgdata/PG962/base/pgsql_tmp/pgsql_tmp17817.2 

What do I miss here? Shouldn't this complete with 16MB work_mem as well, even 
when slower, but in less than one hour? Or is this expected? 

Thanks for your help 
Daniel 

Reply via email to