Несколько одновременных вызовов одного и того же запроса, возвращающихся в одно и то же время, за один вызов, умноженный на количество вызовов - PullRequest
0 голосов
/ 25 октября 2018

При выполнении следующего запроса на Postgres 10 с одновременным использованием пула соединений результаты возвращают через n * время, необходимое для выполнения одного вызова.

Проверено в Racket с использованием потоков и Node с обещаниями.Оба возвращают ~ одинаковые тайминги в миллисекундах.

1 вызовов: 8322

10 вызовов:

82432, 82260, 82025, 82260, 82432, 82103, 82025, 82556,82040, 82119

Вот запрос:

WITH contact_searches as (select
md.geo_point as md_point, md.sf_id as md_name, md.sf_id as md_sf_id, 
md.freehold_tenure as md_fh_ten,
md.freehold_search_price md_fh_sp, md.leasehold_tenure as md_lh_ten, 
md.leasehold_search_price as md_lh_sp,
md.special_tenure_search_price as md_st_sp, md.geo_point as point,
ss.freehold_tenure as ss_fh_ten, ss.leasehold_tenure as ss_lh_ten, 
ss.price_from as ss_pf, ss.price_to as ss_pt, md.marketing_trades as md_trades, 
ss.trades as ss_trades,
ss.sf_id as ss_sf_id, ss.person_id as person_id, ss.areas as areas
from saved_searches ss
inner join marketing_details md on md.marketing_trades && ss.trades
where md.sf_id = ANY ($1)
and
((md.freehold_tenure is not null  and ss.freehold_tenure ='true'
and (md.freehold_search_price is null or md.freehold_search_price >= ss.price_from)
and (md.freehold_search_price is null or md.freehold_search_price <= ss.price_to))
or
(md.leasehold_tenure is not null  and ss.leasehold_tenure ='true'
and (md.leasehold_search_price is null or md.leasehold_search_price >= ss.price_from)
and (md.leasehold_search_price is null or md.leasehold_search_price <= ss.price_to))
or
(md.special_tenure_search_price is not null
and (md.special_tenure_search_price >= ss.price_from)
and (md.special_tenure_search_price <= ss.price_to))
)
), contact_ids as (select distinct person_id as sf_id
from contact_searches inner join areas a on st_contains(a.polygon, contact_searches.point) 
where a.name = ANY (contact_searches.areas))
select c.sf_id, hasoptedoutofemail, preferred_contact_method, cco_email_opt_out, cf_email_opt_out,  valid_email(c)
from contacts c inner join contact_ids on c.sf_id = contact_ids.sf_id where c.applicant_status = 'Live'

Есть ли у кого-нибудь понимание того, не выполняются ли сложные запросы в parralell или есть изменение конфигурации, которое я мог бы сделать иличто еще может помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...