У меня есть запрос PostgreSql следующим образом:
SELECT DISTINCT ON (reference) reference, reference_url
FROM vehicles v
WHERE NOT EXISTS
(select reference
from daily_run_vehicle rv
WHERE ((
handled = False
AND retries >= 5 )
OR rv.timestamp::timestamp::date = now()::date)
AND v.reference=reference);
Где таблица vehicles
содержит около 400 тысяч записей, а таблица daily_run_vehicle
содержит около 50 миллионов записей.
Таким образом, мне нужны все транспортные средства, где это транспортное средство не добавлено в daily_run_vehicle
сегодня или где обработанный столбец имеет значение False
И повторяет попытки column is >= 5
.
Но проблема в том, что запрос выполняется слишком долго.
Есть ли способ написать его лучше, чтобы он выполнялся быстрее?
create table
для рассматриваемых таблиц (включая все индексы) и план выполнения, созданный с помощьюexplain (analyze, buffers)
b> (не просто объяснение) как форматированный текст. Без скриншотов, пожалуйста. Вы также можете загрузить план на explain.depesz.com. - person a_horse_with_no_name   schedule 06.03.2019disctinct on ()
? Без заказа это не имеет смысла. Также: почему вы присваиваете временную метку временной метке? - person a_horse_with_no_name   schedule 06.03.2019timestamp::timestamp::date
можно использоватьtimestamp::date
? - person Boky   schedule 06.03.2019timestamp
являетсяtimestamp
, то нет причин приводить его кtimestamp
- person a_horse_with_no_name   schedule 06.03.2019