Для вашего запроса вам нужны индексы:
client_order(algo_def_id, account_id, exchange_id)
exchange_trade(account_id, exchange_id)
Тем не менее, мне интересно, если запрос было бы быстрее, если бы вы использовали exists
вместо join
- вы выбираете только столбцы из одной таблицы.
Я был бы склонен использовать exists
как:
select et.*
from exchange_trade et
where et.account_id = 'foo' and
et.hedged = false and
exists (select 1
from client_order co
where co.account_id = et.account_id and
co.exchange_id = et.exchange_id and
co.order_id = et.data ->> 'order'
co.algo_def_id = 1
)
order by cast(et.data ->> 'timestamp' AS decimal) desc
Тогда для этого у вас могут быть индексы exchange_trade(account_id, hedged)
и client_order(account_id, exchange_id, oder_id, algo_def_id)
.
Также может быть способ включить метку времени в индекс, чтобы, возможно, избежать сортировки.