на
1) локальном virtualbox 2CPU 4GB RAM (20 запросов подряд - оба ядра грузит на 100%
2) VPS DigitalOcean 4CPU 8GB RAM (20 запросов подряд - общая загрузка ядер порядка 60%)
в таблице 23 млн строк, настройки postgres дефолтные, разве что random_page_cost = 1
На локальной виртуалке запрос выполняется за 750мс
на VPS - 2200мс
почему такая разница?
включите track_io_timing и покажите план запросов целиком и в текстовом виде
В текстовом виде покажите EXPLAIN (ANALYZE, BUFFERS, /*SETTINGS /* если это v12 */ */) запросов.
локальный: Finalize Aggregate (cost=434856.28..434856.29 rows=1 width=8) (actual time=1438.982..1441.518 rows=1 loops=1) Buffers: shared hit=2592 read=311929 -> Gather (cost=434856.06..434856.27 rows=2 width=8) (actual time=1435.906..1441.503 rows=3 loops=1) Workers Planned: 2 Workers Launched: 2 Buffers: shared hit=2592 read=311929 -> Partial Aggregate (cost=433856.06..433856.07 rows=1 width=8) (actual time=1423.963..1423.964 rows=1 loops=3) Buffers: shared hit=2592 read=311929 -> Parallel Seq Scan on campaign_logs (cost=0.00..409989.05 rows=9546805 width=0) (actual time=0.019..999.813 rows=7638647 loops=3) Buffers: shared hit=2592 read=311929 "Settings: random_page_cost = '1'" Planning Time: 40.296 ms JIT: Functions: 8 Options: Inlining false, Optimization false, Expressions true, Deforming true Timing: Generation 0.521 ms, Inlining 0.000 ms, Optimization 0.272 ms, Emission 12.477 ms, Total 13.270 ms Execution Time: 1452.578 ms VPS: Finalize Aggregate (cost=297805.79..297805.80 rows=1 width=8) (actual time=2563.546..2572.621 rows=1 loops=1) Buffers: shared hit=3092 read=62622 -> Gather (cost=297805.58..297805.79 rows=2 width=8) (actual time=2563.441..2572.604 rows=3 loops=1) Workers Planned: 2 Workers Launched: 2 Buffers: shared hit=3092 read=62622 -> Partial Aggregate (cost=296805.58..296805.59 rows=1 width=8) (actual time=2540.214..2540.216 rows=1 loops=3) Buffers: shared hit=3092 read=62622 -> Parallel Index Only Scan using campaign_logs_pkey on campaign_logs (cost=0.44..272931.07 rows=9549802 width=0) (actual time=0.098..1780.596 rows=7638647 loops=3) Heap Fetches: 0 Buffers: shared hit=3092 read=62622 "Settings: random_page_cost = '1'" Planning Time: 1.353 ms JIT: Functions: 8 Options: Inlining false, Optimization false, Expressions true, Deforming true Timing: Generation 1.550 ms, Inlining 0.000 ms, Optimization 0.738 ms, Emission 12.045 ms, Total 14.333 ms Execution Time: 2604.355 ms
не могу пока включить: Query 1: ERROR: permission denied to set parameter "track_io_timing" :(
Так, а на локальном точно такая же схема (в частности, есть ли индекс campaign_logs_pkey)? И неплохо бы посмотреть оценки альтернативных планов, т.е. c index-only scan на локальном, и seq.scan на VPS (путём выключения соотв. enable_*).
база 1:1, восстановлена из одного и того же дампа, после восстановления ничего не менялось вообще
Там и там восстановлена? VACUUM ANALYZE выполнялся там и там (или просто выполните по этой таблице, если есть возможность / "чтоб не думать")? > путём выключения соотв. enable_* - как это сделать? См. SELECT name, setting, unit, context, short_desc FROM pg_settings WHERE name LIKE 'enable_%'; Описания там есть. В сессии выполняете, например, "SET enable_indexonlyscan = off;", потом запрос/explain. Чтобы вернуть к default — "RESET ALL;", если что.
Там и там восстановлена? - ДА, буквально перед запросом по настройкам - посмотрю, сейчас бежать пора, спасибо!
Обсуждают сегодня