![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
Как запустить несколько sql запросов, разделенных ';' при помощи DBI+Perl; Из практики: один такой множественный запрос выполняется гораздо быстрее, чем много маленьких запросов... но в где то в документации к DBI прочитал, что DBI не понимает такие множественные запросы... попробовал составить множественный запрос с помощью PHP - все нормально работает. Как сделать множественный запрос при помощи perl+DBI ??? Спасибо. |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
Вместо множественных следует использовать
my $sth = $dbh->prepare('sql'); foreach (...) { $sth->execute(); } В этом случае разбор запроса делается 1 раз и на вызовы execute накладных расходов почти нет. Так же для insert можно использовать множественную вставку в виде 1 запроса: $dbh->do('insert into table1 (f1, f2) values (v11, v21), (v21, v22), (v31, v32)'); |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
burakov, а если есть индексы, то можно еще и Alter Table использовать для ускорения
Это сообщение отредактировал(а) shamber - 28.4.2010, 19:40 |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
глюк инета
Это сообщение отредактировал(а) shamber - 28.4.2010, 19:42 |
|||
|
||||
DurRandir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 1 Всего: 17 |
Возможность этого зависит от используемой базы (и, соответственно, DBD-драйвера). Можно попробовать не prepare/execute, а do(). Ну и вообще, это плохой способ оптимазиции. Вы что, упираетесь в сетевые задержки, что приходится экономить на отправляемых пакетах? Если нет - оптимизируйте запросы, поможет гораздо лучше.
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день,
ситуация у меня такая joomla Таблица jos_content строк на 2000. (вообщем то пока небольшая, но планируется более 30000 строк) ну и нужно делать update jos_content set ... на определенные поля. по каждой строке (это вообщем то УСЛОВИЕ не подлежащее оптимизации ![]() если это делать по каждой строке своим sql запросом, то получается ГОРАЗДО медленнее чем если взять и свести эти запросы в один и потом выполнить 1 раз. поэтому и вопрос: как это сделать при помощи perl+DBI, поскольку где то видел, что DBI такое в отношении к Mysql делать не умеет. где то даже читал, что мол эта проблема для всех языков программирования, что дескать даже те DBI (к примеру PHP) которые УМЕЮТ выполнять многострочные запросы к БД, на самом деле разбивают их на более составные части по ';' и выполняют по одному запросу.... на практике поимел следующее - попробовал на PHP и все нормально, он понимает такие множественные, составные запросы. И не знаю как он их там выполняет, но все это происходит быстро также как из phpadmin. Добрые люди скажут - ну и пиши тогда на PHP.... ![]() но блин 2 месяца кучу кода писал на perl (поскольку с ним знаком получше) и все работало ОК пока не стала расти БАЗА , неужели тут нет никакого выхода кроме как переписать все на PHP???? про DBI->prepare я не совсем понял, prepare я делаю для каждого запроса, поскольку они разные, DBI->do пробовал - скорость такая же. если я чего не так понял, тут лучше примерчик какой в студию. (запросы выполняю на локальном компе, т.е. с сетевыми задержками проблем нет, есть проблема, чтобы все быстрее работало). |
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
1. Вместо update часто можно использовать replace, т.е.
REPLACE INTO table1 (f1, f2, f3) VALUES (v11, v12, v13), (v21, v22, v23), (v31, v32, v33), ... Перезапись контролирует ключевое поле, т.е. перезаписываеммые данные должны иметь тоже значение в ключевом поле, если совпадение найдено не будет, то добавится новая строка. 2. Про prepare: все базы обрабатывают запросы в 2 этапа -- разбор запроса (создание плана его выполнения) и непосредственное выполнение. Самая дорогая операция по латентности -- первая. Поэтому 1 раз готовим запрос, а потом в цикле его прогоняем N раз my @rows = ( {f1 => 'v11', f2 => 'v12'}, {f1 => 'v21', f2 => 'v22'}, ... ); # 1 раз готовим запрос my $sth = $dbh->prepare('UPDATE table1 SET f2 = ? WHERE f1 = ?'); foreach my $row ( @rows ) { # много раз выполняем $sth->execute( $row{f1}, $row{f2} ); } И этот вариант работает быстрее, чем Ваши куча UPDATE в одной строке в php, т.к. не приходится постоянно делать разбор запросов, но пример из п.1 работает быстрее всех, его ограничивает только размер строки запроса. В mysql он регулируется переменной max_allowed_packet Так же если Вы посмотрите что внутри do(), то увидете там prepare()+execute() PS Это всё весьма хорошо, с примерами, расписано в http://search.cpan.org/~timb/DBI-1.609/DBI.pm |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Спасибо.
попробовал делать prepare как подсказали с вопросиками... навскидку выигрыш во времени если и есть то очень небольшой... процентов 10-15. т.е. ракетой скрипт мой не стал... Может конечно теоретически все теперь более правильно, но практически... не могу сейчас так быстро все на php реализовать.... кучу времени нужно затратить - чтобы сравнить выполнение множественного запроса на php и моего перлового супер prepare... но че то кажется, что сравнение будет не в сторону perl., по крайней мере из phpadmin база быстрее восстанавливается..., а значит надо думать все таки в сторону многострочных запросов. А все таки может кто подскажет, внешнюю утилиту командной строки для запуска mysql запросов, да еще + как ее настроить на denwer. кажется будет быстрее если просто сделать system "какой-нибудь-mysqlplus \@sql-запрос"; |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: нет Всего: 18 |
burakov, на форум денвера?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |