Улучшение агрегированной производительности PostgreSQL - PullRequest
6 голосов
/ 21 февраля 2011

Какой лучший способ увеличить скорость запроса в PostgreSQL, который выполняет агрегацию MAX (id)?

У меня есть скромное количество записей, связанных с идентификатором, которые я могу СЧИТАТЬ () в секунду, например,

select count(id) as cnt from mytable where ref_id=2660

row   cnt
1     2844

Однако, когда я пытаюсь найти самый последний идентификатор записи с помощью MAX (), запрос занимает почти 5 минут.

select max(id) as id from mytable where ref_id=2660

Это удивительно, потому что в остальном я обнаружил, что PG удивительно быстр с гораздо более сложными запросами. Почему такая разница во времени запросов, особенно для такого относительно небольшого количества записей? Как лучше всего улучшить эту производительность?

РЕДАКТИРОВАТЬ: Это план запроса для выше MAX () выберите:

"Result  (cost=219.84..219.85 rows=1 width=0)"
"  InitPlan 1 (returns $0)"
"    ->  Limit  (cost=0.00..219.84 rows=1 width=4)"
"          ->  Index Scan Backward using mytable_pkey on mytable  (cost=0.00..773828.42 rows=3520 width=4)"
"                Filter: ((id IS NOT NULL) AND (ref_id = 2660))"

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Я погуглил, похоже, PostgreSQL (до 8.4) не любит MAX и MIN, он последовательно просматривает таблицу, чтобы получить результат.Трудно сказать, что это ваш случай без плана запроса и версии.

Вы можете попробовать этот обходной путь.

SELECT id from mytable WHERE ref_id=2660 ORDER BY id DESC LIMIT 1

Редактировать: Убедитесь, что у вас есть индекс с (ref_id, id), иначе сканирование таблицы / сортировка неизбежны.

0 голосов
/ 18 июня 2011

Я использую Postgres 8.4 и могу сказать, что это может быть ошибкой в ​​оптимизаторе Postgres, когда не используются индексы для запросов, включающих функции min и max agregation.После изменения моих запросов от Выберите макс (поле) из таблицы для Выбор поля из таблицы по пределу поля 1 Время выполнения моего запроса увеличилось с 10 до менее секунды.Конечно, вы можете определить и проиндексировать соответствующий столбец, иначе postgres сделает seq_scan.

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