Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > аспекты работы DBD |
Автор: yorm 12.6.2008, 16:41 | ||
Подскажите, пожалуйста я делаю запрос в postgres через DBD
я так понимаю, что возврат уже инкапсулирован в sth? а можно ли как-то ограничить возврат? т.е. если возвращается, например 1000 записей, выбрать сначала 100, потом еще и еще (реальная база имеет около десятка миллиардов записей). Чтобы не хранить все в памяти? или такое невозможно и придется пользовать лимит в запросе? и можно ли как-то оптимизировать выборку возврата, чтобы работала побыстрее и занимала поменьше памяти? (т.е не через SQL оптимизировать, а именно алгоритм выборки) |
Автор: tolkien 12.6.2008, 17:50 |
Использовать другой метод. Например bind_columns my $sth = $dbh->prepare($sql); $sth->execute or die $dbh->errstr; my ($field1, $field2, $field3) = (undef, undef, undef); $sth->bind_columns(undef, \($filed1, $field2, field3)); while($sth->fetch()) { print "$filed1 $field2 $field3\n"; } |
Автор: gcc 14.6.2008, 04:57 | ||||||||
вот пример
|
Автор: ginnie 16.6.2008, 11:55 |
Уважаемый gcc, вариант с LIMIT будет тормозить при больших значениях смещения. Лучше использовать конкретные значения id (проиндексированное уникальное возрастающее числовое значение), если такое поле есть в таблице (SELECT ... WHERE id > NNNN LIMIT 10). |
Автор: sir_nuf_nuf 18.6.2008, 10:37 |
А они и не будут хранится все в памяти. Данные не должны извлекаться из базы в момент $dbh->execute($blah). СУБД будет выдавать тебе данные по мере необходимости, т.е. при каждом вызове $sth->fetchrow_arrayref() ты будешь получать кусочек от результата твоего запроса. P.S. на самом деле данные передаются не по строке, а большими кусками, но никак не все сразу. Достаточно открыть какой - нть sql_plus или psql и сделать select * from biiiiig_taaable; Результат ты получишь быстро, очевидно, что не всю таблицу в память клиентского приложения перекачали. |
Автор: gcc 25.4.2009, 18:37 | ||
есть модуль http://kobesearch.cpan.org/htdocs/DBIx-Abstract/DBIx/Abstract.pm.html#clone- а как написать запрос без LIMIT, как с эмулировать его? что такое "уникальное возрастающее числовое значение"? если id, но если какая-го данная строка в диапазоне лимита будет удалена как тогда лимит сделать? |
Автор: ginnie 27.4.2009, 12:38 | ||||
Почему возникла необходимость писать запрос без LIMIT? Я не говорил, что его нужно избегать, я лишь написал, что следует избегать использования больших смещений в LIMIT, заменяя их (по возможности) на использование условий с id. Например, запрос
лучше заменить на
|
Автор: gcc 27.4.2009, 12:42 |
тогда я не так понял..... вот в этом модуле нету LIMIT http://kobesearch.cpan.org/htdocs/DBIx-Abstract/DBIx/Abstract.pm.html#clone- как его сделать LIMIT? (или там надо переделать модуль сам?) |
Автор: ginnie 27.4.2009, 17:32 |
gcc, к сожалению, никакого опыта работы с этим и подобными ему модулями у меня нет, поэтому ничего конкретного посоветовать не могу. Посмотри, http://wiki.class-dbi.com/wiki/Cdbi_pagers тоже описывается проблема с LIMIT в подобных модулях. |
Автор: sir_nuf_nuf 27.4.2009, 18:13 |
gcc, пожалуй что надо. Фишка в чем - с точки зрения ORM - выборка - это множество объектов Из принципов СУБД - выборка неупорядочена (если нет явного указания) и в принципе порядок объектов может отличаться при повторных запросах. Тогда с какого бока ORM должна сама ограничивать множество выбираемых объектов. Это не ее дело. Вставляйте SQL код |