Итерирование по таблице в режиме "Больше чем"
От | Dmitry E. Oboukhov |
---|---|
Тема | Итерирование по таблице в режиме "Больше чем" |
Дата | |
Msg-id | 20161214094402.GD14462@vdsl.uvw.ru обсуждение исходный текст |
Список | 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.090rows=6 loops=1) Index Cond: ((did > 2714) AND (id > 507)) Heap Fetches: 6 Все вроде так как и хочется, но смущает последующий sort. Это из за MAX(id), но в индексе уже все поля расположены именно в том порядке, который нужен. Вопрос: можно ли переписать запрос так чтобы убрать сортировку, а прийти к чистому прогону по индексу? -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
В списке pgsql-ru-general по дате отправления: