Разбиение данных на страницы, должно быть лучше - PullRequest
2 голосов
/ 17 июня 2010

Я прочитал около 10 "учебников", и все они включают в себя одно и то же:

  • Извлечь отсчет из набора данных
  • Извлечь соответствующий набор данных (LIMIT, OFFSET)

IE:

SELECT COUNT(*) 
  FROM table 
 WHERE something = ?

SELECT * 
  FROM table 
 WHERE something =? 
 LIMIT ? offset ?`

Два очень похожих запроса, нет? Должен быть лучший способ сделать это, мой набор данных состоит из 600 000+ строк и уже вялый (результаты определяются более чем 30 предложениями where и варьируются от пользователя к пользователю, но, конечно, правильно индексируются).

Ответы [ 4 ]

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

К сожалению, чтобы получить точное количество на момент запроса, postgresql должен просмотреть все строки, которые соответствуют критериям, и посмотреть, видны ли они для вашей транзакции. Но вам, вероятно, не нужен счет точный , потому что результаты в любом случае устаревают, как только вы отправляете результаты пользователю. Итак, есть вещи, которые вы можете попробовать:

  1. кэшировать счетчик для последующих запросов, поэтому стоимость указана только для первой страницы (вероятно, это мало помогает, большинство людей все равно смотрят только на первую страницу)
  2. если запросы отображаются правильно, используйте специализированную поисковую систему с инвертированным индексом для поиска. Lucene / Solr - хороший выбор.
  3. Если иногда необязательный подсчет не является проблемой, используйте встроенную статистику postgresql для оценки количества строк, которые могут совпадать. Вы можете получить по номерам, сделав объяснение по запросу. Увеличьте целевую статистику по крайней мере для соответствующих таблиц, чтобы получить более точные цифры. Числа могут по-прежнему значительно отличаться от нескольких предикатов, потому что планировщик не знает корреляции между различными предикатами и предполагает, что они не коррелированы. Поэтому такие вещи, как WHERE sex='male' AND has_breasts=true, будут предполагать, что 25% будут совпадать, что, вероятно, на порядок меньше. Если вы запустите объяснение с помощью анализа, вы можете проверить, сколько строк планировщик должен был пройти, чтобы получить первую страницу результатов, сколько фактически должно пройти, и соответствующим образом масштабировать оценку. Это, вероятно, несколько похоже на то, что Google использует, чтобы оценить, сколько страниц соответствует вашему запросу. Если я правильно помню, Lucene должен поддержать аналогичную оценку.
1 голос
/ 17 июня 2010

Использовать статистику для оценки количества. Это поможет сделать это и не принесет вам больших затрат.

См. http://wiki.postgresql.org/wiki/Count_estimate

0 голосов
/ 17 июня 2010

Вы можете CREATE TABLE AS и поместить все результаты в новую таблицу. Тем не менее, вы должны управлять созданными таблицами, если таблицы TEMP не доступны.

0 голосов
/ 17 июня 2010

Вы можете рассмотреть возможность использования курсора.

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