индексирование группы max + по запросу - PullRequest
1 голос
/ 25 мая 2019

Как создать индекс для этого запроса?Я пробовал каждую возможную комбинацию индексов, о которой только мог подумать, но план объяснения всегда показывает, что SEQ_SCAN используется.

select exchange_id, currency, max(timestamp) timestamp2
    from exchange_balance
    where account_id = 'foo'
    group by exchange_id, currency

Таблица сейчас невелика, поэтому она довольно быстрая, но онабудет быстро расти.

PostgreSQL 9.6

[править] добавил группу по col - извините

Я пробовал это, например:

CREATE INDEX idx_exchange_balance_1 ON exchange_balance (exchange_id, currency, timestamp desc, account_id);

Но всегда сканирование таблицы на таблице с 45k строк

1 Ответ

1 голос
/ 25 мая 2019

Для этого запроса:

select exchange_id, currency, max(timestamp) as timestamp2
from exchange_balance
where account_id = 'foo'
group by exchange_id, currency;

Лучший индекс - (account_id, exchange_id, currency, timestamp desc).

. В Postgres это может быть более эффективно при использовании:

select distinct on (account_id, exchange_id, currency) exchange_id, currency, timestamp
from exchange_balance
where account_id = 'foo'
order by account_id, exchange_id, currency, timestamp desc;

Строгоговоря, account_id не требуется в предложении order by или distinct on.Но их сохранение позволяет обобщить запрос для нескольких учетных записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...