Версия Postgres: 12
Запрос:
ОБЪЯСНИТЬ (АНАЛИЗ ИСТИНА, ПОДРОБНОЕ ОПИСАНИЕ ИСТИНА, СТОИМОСТЬ ИСТИНА, БУФЕРЫ ИСТИНА, ВРЕМЯ ИСТИНА) ВЫБЕРИТЕ МИН(id), МАКС(id) ИЗ public.hotel_slot_inventory ГДЕ ( updated_at ›= '2021-03-02 13:30:03' И updated_at ‹ '2021-03-03 06:15:19.127884' );
План запроса:
Result (cost=512.17..512.18 rows=1 width=8) (actual time=65556.920..65556.926 rows=1 loops=1)
Output: $0, $1
Buffers: shared hit=370 read=454012 written=8
I/O Timings: read=62266.717 write=0.194
InitPlan 1 (returns $0)
-> Limit (cost=0.57..256.09 rows=1 width=4) (actual time=65251.998..65252.001 rows=1 loops=1)
Output: hotel_slot_inventory.id
Buffers: shared hit=1 read=453546 written=8
I/O Timings: read=61967.042 write=0.194
-> Index Only Scan using hotel_slot_inventory_id_updated_at_idx on public.hotel_slot_inventory (cost=0.57..3291347.07 rows=12881 width=4) (actual time=65251.996..65251.997 rows=1 loops=1)
Output: hotel_slot_inventory.id
Index Cond: ((hotel_slot_inventory.id IS NOT NULL) AND (hotel_slot_inventory.updated_at >= '2021-03-02 13:30:03'::timestamp without time zone) AND (hotel_slot_inventory.updated_at < '2021-03-03 06:15:19.127884'::timestamp without time zone))
Heap Fetches: 1
Buffers: shared hit=1 read=453546 written=8
I/O Timings: read=61967.042 write=0.194
InitPlan 2 (returns $1)
-> Limit (cost=0.57..256.09 rows=1 width=4) (actual time=304.902..304.903 rows=1 loops=1)
Output: hotel_slot_inventory_1.id
Buffers: shared hit=369 read=466
I/O Timings: read=299.674
-> Index Only Scan Backward using hotel_slot_inventory_id_updated_at_idx on public.hotel_slot_inventory hotel_slot_inventory_1 (cost=0.57..3291347.07 rows=12881 width=4) (actual time=304.899..304.899 rows=1 loops=1)
Output: hotel_slot_inventory_1.id
Index Cond: ((hotel_slot_inventory_1.id IS NOT NULL) AND (hotel_slot_inventory_1.updated_at >= '2021-03-02 13:30:03'::timestamp without time zone) AND (hotel_slot_inventory_1.updated_at < '2021-03-03 06:15:19.127884'::timestamp without time zone))
Heap Fetches: 3892
Buffers: shared hit=369 read=466
I/O Timings: read=299.674
Planning Time: 0.229 ms
Execution Time: 65556.982 ms
(28 rows)
Мы видим, что это простое сканирование только индекса заняло 65556,982 мс. Большую часть времени занимает InitPlan 1 65251,997 мс. Почему так? ему просто нужно было получить первую запись из индекса btree в прямом и обратном поиске соответственно, поскольку запрос запрашивает Min и Max... не нужно извлекать все совпадающие записи из индекса btree
FYI: strong> Вакуум не сильно помог.
Изменить детали раздувания индекса:
реальный_размер: 3751411712 = 3,49 ГБ
дополнительный_размер: 470237184 = 448 МБ
дополнительное_отношение: 12,53
Коэффициент заполнения: 90
bloat_size: 107053056 = 102 МБ
раздувание_отношение: 2,85
Размер таблицы: bloat_size: 475283456 = 453 МБ
раздувание_отношение: 5,088
(updated_at,id)
должен быть быстрым для этого временного диапазона, если предположить, что статистика точна и в этом временном диапазоне действительно всего 12881 строка. Если у вас есть вопрос по этому поводу, вы должны опубликовать его. (а не беспорядочный беспорядок, который вы опубликовали на прошлой неделе, когда вы создавали индексы для таблиц, которые даже не были теми, которые вы запрашивали.) 04.03.2021