Почему с секционировании по месяцам запрос SELECT * from x ORDER BY y DESC LIMIT 1 тратит примерно по 1-2с на скан таблиц?
Представим табличку data(id int, ts bigint, value string, name string).
В эту табличку каждые 5 минут делается инcерт от человека "name".
Я написал тригер который создает по секционированию с использованием наследования таблички по колонке "ts" на каждый месяц: data_2021-01, data_2021-02, data_2021-03, data_2021-04...
Первый человек "name1" начал это делать с 2021-01-01 и до текущего времени регулярно инсертит. Появился второй человек "name2", но он начал инсертить с 2021-03-01.
Всё работает и всё ок.
И тут я хочу получить последнюю запись по каждом человеке:
SELECT * from data
where name = 'name1' ORDER BY ts DESC LIMIT 1
SELECT * from data
where name = 'name2' ORDER BY ts DESC LIMIT 1
и вижу что первый запрос отработает меньше 50мс, а второй за 8с. В EXPLAIN ANALYZE я вижу что второй тратит по 1-2 с на каждую табличку-секцию. Рядом тестов, я сделал вывод что это именно из-за того, что по "name2" нет записей в первых табличках-секциях. Почему так? Пример когда данные есть с первой секции:
EXPLAIN (ANALYZE, BUFFERS)
SELECT * from archive_value
where "variableId" IN('27729f3a-4344-4260-85f1-f64ec0d4cb9f' ) ORDER BY ts DESC LIMIT 1;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=1.89..2.44 rows=1 width=66) (actual time=0.105..0.108 rows=1 loops=1)
Buffers: shared hit=20
-> Merge Append (cost=1.89..184314.73 rows=333654 width=66) (actual time=0.103..0.105 rows=1 loops=1)
Sort Key: archive_value.ts DESC
Buffers: shared hit=20
-> Index Scan Backward using "uniqTsV" on archive_value (cost=0.12..8.14 rows=1 width=88) (actual time=0.006..0.006 rows=0 loops=1)
Index Cond: (("variableId")::text = '27729f3a-4344-4260-85f1-f64ec0d4cb9f'::text)
Buffers: shared hit=1
-> Index Scan Backward using "archive_value_2021-08_ts_idx" on "archive_value_2021-08" (cost=0.43..58173.00 rows=105962 width=66) (actual time=0.025..0.025 rows=1 loops=1)
Filter: (("variableId")::text = '27729f3a-4344-4260-85f1-f64ec0d4cb9f'::text)
Rows Removed by Filter: 9
Buffers: shared hit=4
-> Index Scan Backward using "archive_value_2021-09_ts_idx" on "archive_value_2021-09" (cost=0.43..48256.38 rows=89189 width=66) (actual time=0.022..0.022 rows=1 loops=1)
Filter: (("variableId")::text = '27729f3a-4344-4260-85f1-f64ec0d4cb9f'::text)
Rows Removed by Filter: 9
Buffers: shared hit=5
-> Index Scan Backward using "archive_value_2021-10_ts_idx" on "archive_value_2021-10" (cost=0.43..53996.88 rows=104930 width=66) (actual time=0.023..0.023 rows=1 loops=1)
Filter: (("variableId")::text = '27729f3a-4344-4260-85f1-f64ec0d4cb9f'::text)
Rows Removed by Filter: 9
Buffers: shared hit=5
-> Index Scan Backward using "archive_value_2021-11_ts_idx" on "archive_value_2021-11" (cost=0.42..18338.39 rows=33572 width=66) (actual time=0.024..0.024 rows=1 loops=1)
Filter: (("variableId")::text = '27729f3a-4344-4260-85f1-f64ec0d4cb9f'::text)
Rows Removed by Filter: 10
Buffers: shared hit=5
Planning Time: 0.701 ms
Execution Time: 0.158 ms
(26 rows)
Когда данные с ноября:
EXPLAIN (ANALYZE, BUFFERS)
SELECT * from archive_value
where "variableId" IN('a79f5e33-0891-4e91-bac0-9f114f399a88' ) ORDER BY ts DESC LIMIT 1;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=1.89..319.45 rows=1 width=66) (actual time=1442.288..1442.291 rows=1 loops=1)
Buffers: shared hit=306803 read=57114 written=15
-> Merge Append (cost=1.89..178788.64 rows=563 width=66) (actual time=1442.286..1442.288 rows=1 loops=1)
Sort Key: archive_value.ts DESC
Buffers: shared hit=306803 read=57114 written=15
-> Index Scan Backward using "uniqTsV" on archive_value (cost=0.12..8.14 rows=1 width=88) (actual time=0.007..0.007 rows=0 loops=1)
Index Cond: (("variableId")::text = 'a79f5e33-0891-4e91-bac0-9f114f399a88'::text)
Buffers: shared hit=1
-> Index Scan Backward using "archive_value_2021-08_ts_idx" on "archive_value_2021-08" (cost=0.43..58173.00 rows=1 width=66) (actual time=507.369..507.369 rows=0 loops=1)
Filter: (("variableId")::text = 'a79f5e33-0891-4e91-bac0-9f114f399a88'::text)
Rows Removed by Filter: 1295919
Buffers: shared hit=111084 read=20706 written=13
-> Index Scan Backward using "archive_value_2021-09_ts_idx" on "archive_value_2021-09" (cost=0.43..48256.38 rows=1 width=66) (actual time=419.358..419.359 rows=0 loops=1)
Filter: (("variableId")::text = 'a79f5e33-0891-4e91-bac0-9f114f399a88'::text)
Rows Removed by Filter: 1075003
Buffers: shared hit=91865 read=17182
-> Index Scan Backward using "archive_value_2021-10_ts_idx" on "archive_value_2021-10" (cost=0.43..53996.88 rows=1 width=66) (actual time=515.492..515.492 rows=0 loops=1)
Filter: (("variableId")::text = 'a79f5e33-0891-4e91-bac0-9f114f399a88'::text)
Rows Removed by Filter: 1202795
Buffers: shared hit=103853 read=19222 written=2
-> Index Scan Backward using "archive_value_2021-11_ts_idx" on "archive_value_2021-11" (cost=0.42..18344.83 rows=559 width=66) (actual time=0.053..0.053 rows=1 loops=1)
Filter: (("variableId")::text = 'a79f5e33-0891-4e91-bac0-9f114f399a88'::text)
Buffers: shared read=4
Planning Time: 0.840 ms
Execution Time: 1442.353 ms
(25 rows)