The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Оптимизация и Промышленные системы (Другие СУБД)
Изначальное сообщение [ Отслеживать ]

"PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +/
Сообщение от kutsy email(ok) on 31-Июл-10, 14:26 
Всем привет.

Такой вопрос:

Как можно ускорить операции LIMIT, OFFSET и ORDER BY для огромных (порядка 1-10 GB) таблиц при обычных SELECT'ах?

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +1 +/
Сообщение от parad (ok) on 01-Авг-10, 01:52 
ввести столбец с идентификатором записи, проиндексировать по нему и выгребать:
select ... where ( row_id >= [offset] )and( row_id < [offset+limit] )

пс. 10гб - это очень мало. огромным тут и не пахнет, тем более для постгри. )

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +/
Сообщение от kutsy (ok) on 01-Авг-10, 08:01 
>ввести столбец с идентификатором записи, проиндексировать по нему и выгребать:
>select ... where ( row_id >= [offset] )and( row_id < [offset+limit] )
>
>пс. 10гб - это очень мало. огромным тут и не пахнет, тем
>более для постгри. )

Получается, что это будет что-то типа обычного идентификатора (ID), но его нужно будет держать жестко по-порядку без прерываний. Верно?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +1 +/
Сообщение от parad (ok) on 01-Авг-10, 17:03 
в зависимости от требований. к примеру вполне нормальная картина работы форума( на страницу к примеру 20 тем ):

- модераторы удаляют тему с идентификатором 105. получается, что для 6-ой странице( 100-119 ) списка тем у нас не хватает 105 чтобы ровно вывести 20.
- однако лимит с офсетом выведут 100-120 без 105.
- черевато только тем, что и на 7ой странице продублируется топик с номером 120.
- что не есть страшно. зато скорость.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +/
Сообщение от kutsy (ok) on 01-Авг-10, 20:23 
>в зависимости от требований. к примеру вполне нормальная картина работы форума( на
>страницу к примеру 20 тем ):
>
> - модераторы удаляют тему с идентификатором 105. получается, что для 6-ой
>странице( 100-119 ) списка тем у нас не хватает 105 чтобы
>ровно вывести 20.
> - однако лимит с офсетом выведут 100-120 без 105.
> - черевато только тем, что и на 7ой странице продублируется топик
>с номером 120.
> - что не есть страшно. зато скорость.

Ага, я понял.
Но в данном случаи как раз критично чтобы на странице было именно 20 тем (к примеру).

Я думал о том, что нужно на удаление записи вешать триггер, что будет изменять это поле, чтобы было по-порядку, начиная с удаляемой записи и до конца. Остаётся только попробовать насколько это будет быстро для таблиц подобного размера.

Или может есть более лучшее решение?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +1 +/
Сообщение от parad (ok) on 02-Авг-10, 04:40 
сходу креативится одно более менее решение, но оно зависит от частоты и объемов удаляемых строк. до определенных цифр( можете посчетать сами )) ) будет работать быстрее оффсета и лимита.

- сделать проинтексированный столбец-нумератор как описано выше.
- создать таблицу, в которую будут сохранятся удаляемые идентификаторы.
- написать хранимку, выполняющую следующее:

...
select count(*) into i_count from saved_deleted where some_id<=[offset]; -- счетаем сколько было удалено в оффсете.
select ... where ( row_id >= [offset] - i_count )and( row_id < [offset+limit] - i_count ); -- селектим учитывая поправку на удаленные.
...

периодически можно уплотнять счетчик по крону - черевато блокировкой таблицы на время.
если есть возможность - повторно использовать удаленные идентификаторы.

всегда можно улучшить. все зависит от... )

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +/
Сообщение от kutsy (ok) on 02-Авг-10, 07:33 
Спасибо.
Я понял.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "PostgreSQL: Как ускорить операции LIMIT, OFFSET, ORDER BY?"  +/
Сообщение от Nirnroot on 07-Авг-10, 06:10 
Теоретически можно и не удалять строки сразу, а только помечать как удаленные.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру