PostgreSQL план запроса изменен - PullRequest
0 голосов
/ 08 мая 2020

Недавно я провел полную очистку ряда таблиц, и конкретный запрос на мониторинг c внезапно стал очень медленным. Раньше это был запрос, который мы использовали для мониторинга, поэтому он с радостью запускался каждые 10 секунд c в течение последних 2 месяцев, но с падением производительности, которое произошло после вакуума, большинство используемых панелей мониторинга не работает, и он увеличивается до на сервере заканчиваются соединения или ресурсы в зависимости от.

К сожалению, у меня нет вывода объяснения предыдущего. , time) выберите min (id) из iqsim_cdrs;

 Result  (cost=0.64..0.65 rows=1 width=8) (actual time=6.222..6.222 rows=1 loops=1)
   InitPlan 1 (returns $0)
     ->  Limit  (cost=0.57..0.64 rows=1 width=8) (actual time=6.216..6.217 rows=1 loops=1)
           ->  Index Only Scan using iqsim_cdrs_pkey on iqsim_cdrs  (cost=0.57..34265771.63 rows=531041357 width=8) (a
ctual time=6.213..6.213 rows=1 loops=1)
                 Index Cond: (id IS NOT NULL)
                 Heap Fetches: 1
 Planning time: 1.876 ms
 Execution time: 6.313 ms
(8 rows)

Ограничив дату:

объяснение (анализ, время) выберите min (id) из iqsim_cdrs, где timestamp <'2019- 01-01 00:00:00 '; </p>

 Result  (cost=7.38..7.39 rows=1 width=8) (actual time=363763.144..363763.145 rows=1 loops=1)
   InitPlan 1 (returns $0)
     ->  Limit  (cost=0.57..7.38 rows=1 width=8) (actual time=363763.137..363763.138 rows=1 loops=1)
           ->  Index Scan using iqsim_cdrs_pkey on iqsim_cdrs  (cost=0.57..35593384.68 rows=5227047 width=8) (actual t
ime=363763.133..363763.133 rows=1 loops=1)
                 Index Cond: (id IS NOT NULL)
                 Filter: ("timestamp" < '2019-01-01 00:00:00'::timestamp without time zone)
                 Rows Removed by Filter: 488693105
 Planning time: 7.707 ms
 Execution time: 363763.219 ms
(9 rows)

Не уверен, что могло быть причиной этого, я могу только предположить, что до полного вакуума он использовал индекс на метке времени?

* ОБНОВЛЕНИЕ * Согласно рекомендации @ jjanes, здесь обновление id + 0

 explain (analyze,timing) select min(id+0) from iqsim_cdrs where timestamp < '2019-01-01 00:00:00';
                                                                          QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=377400.34..377400.35 rows=1 width=8) (actual time=109.176..109.177 rows=1 loops=1)
   ->  Index Scan using index_iqsim_cdrs_on_timestamp on iqsim_cdrs  (cost=0.57..351196.84 rows=5240699 width=8) (actual time=0.131..108.911 rows=126 loops=1)
         Index Cond: ("timestamp" < '2019-01-01 00:00:00'::timestamp without time zone)
 Planning time: 4.756 ms
 Execution time: 109.405 ms
(5 rows)
...