![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
yorm |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 1.10.2006 Репутация: нет Всего: нет |
Подскажите, пожалуйста
я делаю запрос в postgres через DBD
я так понимаю, что возврат уже инкапсулирован в sth? а можно ли как-то ограничить возврат? т.е. если возвращается, например 1000 записей, выбрать сначала 100, потом еще и еще (реальная база имеет около десятка миллиардов записей). Чтобы не хранить все в памяти? или такое невозможно и придется пользовать лимит в запросе? и можно ли как-то оптимизировать выборку возврата, чтобы работала побыстрее и занимала поменьше памяти? (т.е не через SQL оптимизировать, а именно алгоритм выборки) Это сообщение отредактировал(а) yorm - 12.6.2008, 16:52 |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
Использовать другой метод. Например 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 |
|
||||||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
вот пример
|
||||||||
|
|||||||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый gcc, вариант с LIMIT будет тормозить при больших значениях смещения. Лучше использовать конкретные значения id (проиндексированное уникальное возрастающее числовое значение), если такое поле есть в таблице (SELECT ... WHERE id > NNNN LIMIT 10).
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
А они и не будут хранится все в памяти.
Данные не должны извлекаться из базы в момент $dbh->execute($blah). СУБД будет выдавать тебе данные по мере необходимости, т.е. при каждом вызове $sth->fetchrow_arrayref() ты будешь получать кусочек от результата твоего запроса. P.S. на самом деле данные передаются не по строке, а большими кусками, но никак не все сразу. Достаточно открыть какой - нть sql_plus или psql и сделать select * from biiiiig_taaable; Результат ты получишь быстро, очевидно, что не всю таблицу в память клиентского приложения перекачали. |
|||
|
||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
есть модуль http://kobesearch.cpan.org/htdocs/DBIx-Abs....pm.html#clone- а как написать запрос без LIMIT, как с эмулировать его? что такое "уникальное возрастающее числовое значение"? если id, но если какая-го данная строка в диапазоне лимита будет удалена как тогда лимит сделать? Это сообщение отредактировал(а) gcc - 25.4.2009, 18:39 |
|||
|
||||
ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Почему возникла необходимость писать запрос без LIMIT? Я не говорил, что его нужно избегать, я лишь написал, что следует избегать использования больших смещений в LIMIT, заменяя их (по возможности) на использование условий с id. Например, запрос
лучше заменить на
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
тогда я не так понял.....
вот в этом модуле нету LIMIT http://kobesearch.cpan.org/htdocs/DBIx-Abs....pm.html#clone- как его сделать LIMIT? (или там надо переделать модуль сам?) |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
gcc, к сожалению, никакого опыта работы с этим и подобными ему модулями у меня нет, поэтому ничего конкретного посоветовать не могу. Посмотри, здесь тоже описывается проблема с LIMIT в подобных модулях.
Это сообщение отредактировал(а) ginnie - 27.4.2009, 17:32 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
gcc, пожалуй что надо.
Фишка в чем - с точки зрения ORM - выборка - это множество объектов Из принципов СУБД - выборка неупорядочена (если нет явного указания) и в принципе порядок объектов может отличаться при повторных запросах. Тогда с какого бока ORM должна сама ограничивать множество выбираемых объектов. Это не ее дело. Вставляйте SQL код |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |