поиск MAX (db_timestamp) запроса - PullRequest
0 голосов
/ 04 июня 2010

У меня есть БОЛЬШАЯ таблица с несколькими индексами в postgres. У него есть индексы на db_timestamp, id, username.

Я хочу найти максимальную временную метку для конкретного имени пользователя. Проблема заключается в простом запросе типа

SELECT MAX(db_timestamp) FROM Foo WHERE username = 'foo'

занимает столько времени из-за огромного размера таблицы (речь идет о таблице 450 ГБ с индексами размером более 30 ГБ).

Есть ли какой-нибудь способ оптимизировать этот запрос или сообщить postgres о том, какой план запроса использовать?

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Используйте создание индекса для имени пользователя и db_timestamp с правильным порядком сортировки:

CREATE INDEX idx_foo ON foo (username ASC, db_timestamp DESC);

Установите флажок EXPLAIN, чтобы увидеть, работают ли все как следует.

1 голос
/ 04 июня 2010

Postgresql не может использовать индекс on (db_timestamp, id, username) для удовлетворения этого запроса - искомый термин запроса должен быть префиксом индекса, то есть с использованием первого столбца (столбцов).

Таким образом, индекс для (username, db_timestamp) будет очень хорошо обслуживать этот запрос, поскольку он просто должен сканировать поддерево (username, 0) .. (username, + inf) (а iirc Postresql должен знать, что попытаться и найти (имя пользователя, + inf) и пройти в обратном порядке).

В целом, «покрытие индексов» не является полезным методом с Postgresql, как с другими базами данных, из-за необходимости Postgresql обращаться к кортежам кучи для получения информации о видимости.

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