Проблемы со снежинкой LIMIT / OFFSET - PullRequest
0 голосов
/ 27 апреля 2020

Я обрабатываю 260-миллиметровую строку, ~ 1500 столбцов таблицы в виде фрагментов в модели Python. Используя коннекторы, я каждый раз собираю по 100 000 записей. Я использую LIMIT и OFFSET, чтобы перебрать таблицу. После каждого раздела я увеличиваю смещение на размер фрагмента. По мере увеличения OFFSET время выполнения запроса увеличивается до такой степени, что каждый кусок занимает у меня более 45 минут, чтобы схватиться ближе к концу. Вот макет моего запроса:

SELECT ~50_fields
FROM mytable
WHERE a_couple_conditions
ORDER BY my_primary_key
LIMIT 100000 OFFSET #########

Учитывая производительность, это особенно плохой способ запустить это. Я читал, что, возможно, смогу использовать RESULT_SCAN, чтобы ускорить его, но в документах говорилось, что мне все равно нужно будет использовать ORDER BY против него, что, как мне кажется, может победить цель. На самом деле мне все равно, в каком порядке записи попадают в мой процесс, просто я обрабатываю каждую строку ровно один раз.

Есть ли способ заставить эти запросы выполняться за приемлемое время, или я должен рассмотреть что-то вроде резкого увеличения LIMIT для каждого чанка, а затем разбить его дальше в моей программе? Какие-нибудь идеи или лучшие способы заставить Снежинку играть в мяч?

1 Ответ

0 голосов
/ 27 апреля 2020

Что если вы попробовали что-то подобное?

SELECT ~50_fields, row_number() OVER (ORDER BY my_primary_key) as row_cnt
FROM mytable
WHERE a_couple_conditions;

, а затем от l oop до:

SELECT ~50_fields
FROM table(result_scan(query_id))
WHERE row_cnt BETWEEN x and xx;

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

...