синк реплике и асинк реплике.
explain (analyse, verbose, buffers)
select count(*), state
from megapm.transactions
where state in (1, 2, 5)
group by state;
Результаты:
Мастер
GroupAggregate (cost=0.38..5.37 rows=1 width=10) (actual time=13.695..14.307 rows=3 loops=1)
Output: count(*), state
Group Key: transactions.state
Buffers: shared hit=4053
-> Index Only Scan using transactions_state_updated_at_idx_not_final on megapm.transactions (cost=0.38..5.35 rows=1 width=2) (actual time=4.206..14.268 rows=94 loops=1)
Output: state, updated_at
Index Cond: (transactions.state = ANY ('{1,2,5}'::integer[]))
Heap Fetches: 214
Buffers: shared hit=4053
Planning:
Buffers: shared hit=28
Planning Time: 1.155 ms
Execution Time: 14.394 ms
синк реплика:
GroupAggregate (cost=0.38..5.37 rows=1 width=10) (actual time=2563.073..2569.132 rows=2 loops=1)
Output: count(*), state
Group Key: transactions.state
Buffers: shared hit=619674
-> Index Only Scan using transactions_state_updated_at_idx_not_final on megapm.transactions (cost=0.38..5.35 rows=1 width=2) (actual time=1197.508..2569.044 rows=75 loops=1)
Output: state, updated_at
Index Cond: (transactions.state = ANY ('{1,2,5}'::integer[]))
Heap Fetches: 630564
Buffers: shared hit=619674
Planning:
Buffers: shared hit=186
Planning Time: 10.355 ms
Execution Time: 2569.679 ms
асинк реплика:
GroupAggregate (cost=0.38..5.37 rows=1 width=10) (actual time=678.281..680.183 rows=3 loops=1)
Output: count(*), state
Group Key: transactions.state
Buffers: shared hit=619963
-> Index Only Scan using transactions_state_updated_at_idx_not_final on megapm.transactions (cost=0.38..5.35 rows=1 width=2) (actual time=344.970..680.140 rows=100 loops=1)
Output: state, updated_at
Index Cond: (transactions.state = ANY ('{1,2,5}'::integer[]))
Heap Fetches: 630820
Buffers: shared hit=619963
Planning:
Buffers: shared hit=145
Planning Time: 1.686 ms
Execution Time: 680.223 ms
Вижу существенные различия в Heap Fetches и shared hit.
Как так получилось? И как этого избежать?
Я вот вижу существенные различия в результате (rows=3 vs rows=2) — вот это и смотрите, как там получилось. Но, на самом деле, по дефолту синк реплика только принимает WAL синхронно (чтобы потом догнаться), отставать она можэт на сколько угодно.
Я их не одновременно запускал, но с разницей не больше минуты. Эти записи меняются активно и в какой-то момент со state = 1 вполне могло быть 0 строк. Но в то же время общее количество строк не больше 100, и отставание реплики не объясняет почему на мастере Heap Fetches: 214 Buffers: shared hit=4053 а на репликах Heap Fetches: 630564 Buffers: shared hit=619674 Вакуум же только на мастере должен работать?
Обсуждают сегодня