postgresql: offset + limit работает очень медленно

У меня есть таблица tmp_drop_ids с одним столбцом, id и 3,3 миллиона Я хочу перебирать таблицу, делая что-то с каждыми 200 записями. У меня есть этот код:

LIMIT = 200
for offset in xrange(0, drop_count+LIMIT, LIMIT):
    print "Making tmp table with ids %s to %s/%s" % (offset, offset+LIMIT, drop_count)
    query = """DROP TABLE IF EXISTS tmp_cur_drop_ids; CREATE TABLE tmp_cur_drop_ids AS
    SELECT id FROM tmp_drop_ids ORDER BY id OFFSET %s LIMIT %s;""" % (offset, LIMIT)
    cursor.execute(query)

Сначала это работает нормально (~ 0,15 с для создания таблицы tmp), но время от времени замедляется, например, около 300 тыс. билетов на создание этой таблицы tmp заняло 11-12 секунд, и снова около 400 тыс. Это в основном кажется ненадежным.

Я буду использовать эти идентификаторы в других запросах, поэтому я решил, что лучше всего их разместить в tmp. Есть ли лучший способ перебирать такие результаты?

5
задан Claudiu 1 November 2011 в 23:27
поделиться