есть таблица
"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