Повышение производительности OFFSET в PostgreSQL

У меня есть таблица, в которой я выполняю ORDER BY перед LIMIT и OFFSET для разбивки на страницы.

] Добавление индекса в столбец ORDER BY имеет огромное значение для производительности (при использовании в сочетании с небольшим LIMIT). В таблице с 500 000 строками я заметил 10 000-кратное улучшение при добавлении индекса, пока был небольшой LIMIT .

Однако индекс не влияет на высокие значения OFFSET (то есть более поздние страницы в моей разбивке на страницы) Это понятно: индекс b-дерева позволяет легко выполнять итерацию по порядку с самого начала, но не найти n-й элемент.

Похоже, что поможет подсчитанный индекс b-дерева ,но я не знаю о их поддержке в PostgreSQL. Есть другое решение? Кажется, что оптимизация для больших смещений (особенно в случаях использования разбивки на страницы) не такая уж редкость.

К сожалению, в руководстве PostgreSQL просто сказано: «Строки, пропущенные предложением OFFSET, по-прежнему должны вычисляться внутри сервера; поэтому большое СМЕЩЕНИЕ может быть неэффективным. "

38
задан James Tauber 7 July 2011 в 23:36
поделиться