2010-06-03 2 views
0

У меня есть таблица BIG с несколькими индексами в postgres. Он имеет индексы на db_timestamp, id, username.запрос MAX (db_timestamp)

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

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

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

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

+0

Как насчет копирования вывода EXPLAIN? – leonbloy

ответ

2

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

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

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

+0

, если я добавлю такой индекс и избавлюсь от отдельных индексов, повлияет ли это на другие запросы, только если включить имя пользователя или db_timestamp в отдельности? – Sujit

+0

Возможно, я понятия не имею, какие запросы вы выполняете. Любой запрос, который может извлечь выгоду из индекса только для db_timestamp (или начиная с db_timestamp), не будет использовать указанный выше индекс. Только запросы, начинающиеся с состояния или порядка сортировки по имени пользователя, также могут извлекаться из индекса db_timestamp в индексе. Проверьте EXPLAIN, чтобы узнать, как выполняются ваши запросы. –

1

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

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

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