powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / limit - offset
7 сообщений из 7, страница 1 из 1
limit - offset
    #32762315
nevermind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Товарищи, расписываю обычную ситуацию: есть таблица порядка 500 000 записей, есть запрос, который в зависимости от условий вытаскивает от 20 до 20 000 записей из этой таблицы. Далее, все это дело разбивается на порции по 10 записей вне зависимости от того, сколько вытащили (обычная постраничная разбивка). Так вот, сейчас это все дело происходит через обычный limit - offset, что не очень (мягко говоря) эффективно, потому что конечная цель - вытащить 10 записей из таблицы (а не 10 000, а потом из них уже нужные 10). Один из лобовых способов решения проблемы - добавить соотв. колонку "номер записи при данном виде сортировки", может быть даже неск. полей для каждого вида сортировки. Но тогда придется пересчитывать это дело при каждом апдейте (иногда немало пересчитывать). Какие будут идеи? Мож где почитать что есть?
...
Рейтинг: 0 / 0
limit - offset
    #32762465
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стандартная методика - использовать вспомогательную временную таблицу с ключом отобранных записей и индексированным serial-полем для сортировки. А потом на каждую страницу брать limit - offset из времянки и выбирать данные из основной таблицы. Вроде такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create temporary table tmp (
  seq serial primary key,
  id int
);
insert into tmp (id) 
select id 
from mybigtable 
where ... --большое тормозное условие выборки
order by ...
...
...
...
--страница N
select t.*
from tmp
  join mybigtable t on t.id=tmp.id
order by tmp.seq
limit  10  offset n; --N*10
...
Рейтинг: 0 / 0
limit - offset
    #32762692
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nevermindобычная постраничная разбивкаЕсли вместо обычной разбивки "страницы: 1 2 3 4 5 " устраивает урезанная следующего вида "страницы: начало | следующая ", то можно в таблицу добавить дополнительное поле, порядок значений в котором совпадает с одним из необходимых порядков сортировки в показе. Тогда на каждую страницу надо будет делать запрос типа "... where order1 > 324 limit 11", и значение order1 из 11 строки, если таковая найдется, передавать на следующую страницу и использовать там в ограничении "where order > ...".

Для того чтобы не делать апдейты при каждом изменении данных, нужно придумать правильную:) функцию вычисления order1 по другим полям строки. Например, если нужна сортировка по совокупности "категория, производитель, цена", при этом категории и производители в базе меняются редко, имеется не более 99 категорий, 99 производителей, целые цены в долларах от 1 до 999, то order1 можно сделать целым полем формата CCTTPPP, где CC - код категории, TT - производителя, PPP - цена.
...
Рейтинг: 0 / 0
limit - offset
    #32762947
nevermind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2фффф: понятно, спасибо. Так примерно и думал
2LeXa NalBat: к сожалению нужна именно постраничная :( Будем думать функцию :)
...
Рейтинг: 0 / 0
limit - offset
    #32765609
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что то не очень понятно, чем вас не устраивает limit - offset?
В чем сложность то?
...
Рейтинг: 0 / 0
limit - offset
    #32773072
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximZчто то не очень понятно, чем вас не устраивает limit - offset?"limit - offset" наверное не нравится медленной скоростью выполнения при больших значениях offset. LeXa NalBat Обсуждение "Быстрая сортировка" : Если в запросе большой offset, то постгрес должен прочитать это большое число записей прежде чем начнет выдавать результат. У меня запрос "select id from foo order by id limit 10" работает 0.15 секунды, а запрос "select id from foo order by id offset 1000000 limit 10" - 3.5 секунды. Как побороть такое замедление, не знаю. :-( Может быть ввести поле ordr, которое будет упорядочено как id, но принимать последовательные натуральные значения начиная с 1 - тогда второй запрос надо переписать так: "select id from foo where ordr > 1000000 order by ordr limit 10", и он будет выполняться быстро. Однако как в этом случае быстро добавлять строки с id<max(id), удалять строки?
...
Рейтинг: 0 / 0
limit - offset
    #33319843
nevermind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поднимаю тему с некоторым обобщением (мож у кого новые идеи появились). фффф подал хорошую идею, НО если у нас есть очень большая таблица, из которой выбираются порции разного объема, то получается на каждый такой запрос и вид сортировки надо хранить свою временную таблицу и довольно часто все эти таблицы обновлять. Кол-во таблиц может быть ооочень большим...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / limit - offset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]