Итерирование по таблице в режиме "Больше чем"

From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Итерирование по таблице в режиме "Больше чем"
Date: 2016-12-14 09:44:02
Message-ID: 20161214094402.GD14462@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

есть таблица

"id" SERIAL
"did" INTEGER REFERENCES (NOT UNIQUE)

Таблица очень большая.

Нужен скрипт который обойдет данную таблицу по уникальным did, причем
желательно в порядке по возрастанию ID.
При этом желательно использовать индекс

Взял и просто построил индекс BTREE("did", "id")

Далее запрашиваю кусочек таким образом:

SELECT
MAX("id") AS "id",
"did" AS "did"
FROM
"table"
WHERE
"id" > $id
AND "did" > $did
GROUP BY
"did"
ORDER BY
"did" ASC,
"id" ASC
LIMIT
10

Получаю пачку, обрабатываю ее и следующему запросу передаю
$id = max($id) и $did = max($did)

EXPLAIN показывает что индекс используется:

Limit (cost=8.32..8.32 rows=1 width=8) (actual time=0.113..0.114 rows=6 loops=1)
-> Sort (cost=8.32..8.32 rows=1 width=8) (actual time=0.113..0.113 rows=6 loops=1)
Sort Key: did, (max(id))
Sort Method: quicksort Memory: 25kB
-> GroupAggregate (cost=0.27..8.31 rows=1 width=8) (actual time=0.092..0.102 rows=6 loops=1)
Group Key: did
-> Index Only Scan using test_index on table (cost=0.27..8.29 rows=1 width=8) (actual time=0.068..0.090 rows=6 loops=1)
Index Cond: ((did > 2714) AND (id > 507))
Heap Fetches: 6

Все вроде так как и хочется, но смущает последующий sort.
Это из за MAX(id), но в индексе уже все поля расположены именно в том порядке,
который нужен.

Вопрос: можно ли переписать запрос так чтобы убрать сортировку, а
прийти к чистому прогону по индексу?
--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Oleksandr Shulgin 2016-12-14 10:50:58 Re: [pgsql-ru-general] Итерирование по таблице в режиме "Больше чем"
Previous Message Dmitry E. Oboukhov 2016-10-08 09:45:40 Re: DBGlass - Open-source кросс-платформенный GUI клиент