Какая альтернатива курсорам для извлечения больших объемов данных из базы данных? - PullRequest
5 голосов
/ 30 ноября 2010

Поиск через stackoverflow Я нашел большое количество ответов, осуждающих использование курсоров в программировании баз данных.Однако я не совсем понимаю, какова альтернатива.

Я создаю программу, которая считывает большое количество строк (сотни тысяч) из базы данных и сохраняет их в памяти по соображениям производительности.Я действительно не могу запустить таблицу SELECT * FROM и обработать все результаты одновременно, могу ли я?

Лучший способ, который я нашел, - это использовать курсоры и извлекать строки с шагом, например, 10 привремя.

Может ли кто-нибудь просветить меня?Я использую PostgreSQL 9 на Linux.

Спасибо

Ответы [ 6 ]

1 голос
/ 30 ноября 2010

Я полагаю, что лучше всего использовать COPY для получения необходимых данных непосредственно в вашем клиентском приложении.

У меня также не было проблем при использовании курсоров.Насколько я понимаю, курсор хранит снимок данных для вас, и формально он (и COPY) является единственным правильным способом просмотра результатов, поскольку в противном случае использование LIMIT..OFFSET может привести к несоответствиям, так каксмещение изменяется вновь вставленными записями.

1 голос
/ 30 ноября 2010

Вы можете напрямую использовать цикл for, используя запись:

do
$$
declare r record;

begin

    for r in select product_id, name from products loop
        raise notice '% %', r.product_id, r.jname;
    end loop;

end$$
1 голос
/ 30 ноября 2010

CURSOR - лучший вариант, когда вам приходится иметь дело с большими объемами данных.Вы также можете использовать метод LIMIT .. OFFSET .., но это будет все медленнее и медленнее, в зависимости от объема данных.PostgreSQL не имеет проблем с курсорами, используйте их при работе с большими объемами данных.

SQL Server имел / имел проблемы с курсорами, MySQL не может обрабатывать курсоры вне хранимых функций, что может быть причинойнекоторые DBA не любят курсоры.

0 голосов
/ 03 декабря 2010

Если вы просто загружаете данные, почему бы не использовать select?Вы не экономите память, вытягивая по 10 строк за раз, потому что вы все равно кэшируете все в памяти.

Я что-то упустил?

0 голосов
/ 30 ноября 2010

Редко нужен курсор. Возможно, если ваша логика меняется при обновлении каждой предыдущей строки, вам может понадобиться курсор.

Вам действительно нужно открыть курсор для вашей проблемы? Можете ли вы дать конкретику того, что вы пытаетесь сделать? Большие наборы данных - это хорошая причина избегать курсоров, а не причина их использования.

Вы должны попытаться выполнить обработку на основе множеств. Просто регулярные обновления на столах, с объединениями и фильтрами.

Может ли простое обновление заменить ваш цикл курсора?

0 голосов
/ 30 ноября 2010

Посмотрите на LIMIT и OFFSET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...