Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl+DBI Множественные запросы, можно ли запрос; запрос; при помощи DBI 
:(
    Опции темы
burakov
Дата 28.4.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Добрый день.

Как запустить несколько sql запросов, разделенных ';'  при помощи 
DBI+Perl;

Из практики: один такой множественный запрос выполняется гораздо быстрее, чем много маленьких запросов...

но в где то в документации к DBI прочитал, что DBI не понимает такие множественные запросы...

попробовал составить множественный запрос с помощью PHP - все нормально работает.

Как сделать множественный запрос при помощи perl+DBI ???


Спасибо.


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
vadiml
Дата 28.4.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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)');
PM MAIL Jabber   Вверх
shamber
Дата 28.4.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



burakov, а если есть индексы, то можно еще и Alter Table использовать для ускорения

Это сообщение отредактировал(а) shamber - 28.4.2010, 19:40
PM MAIL Jabber   Вверх
shamber
Дата 28.4.2010, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



глюк инета

Это сообщение отредактировал(а) shamber - 28.4.2010, 19:42
PM MAIL Jabber   Вверх
DurRandir
Дата 29.4.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 1
Всего: 17



Возможность этого зависит от используемой базы (и, соответственно, DBD-драйвера). Можно попробовать не prepare/execute, а do(). Ну и вообще, это плохой способ оптимазиции. Вы что, упираетесь в сетевые задержки, что приходится экономить на отправляемых пакетах? Если нет - оптимизируйте запросы, поможет гораздо лучше.
PM   Вверх
burakov
Дата 29.4.2010, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Добрый день,

ситуация у меня такая
joomla 
Таблица jos_content строк на 2000. (вообщем то пока небольшая, но планируется более 30000 строк)

ну и нужно делать 
update jos_content set ... на определенные поля. по каждой строке (это вообщем то УСЛОВИЕ не подлежащее оптимизации smile)

если это делать по каждой строке своим sql запросом, то получается ГОРАЗДО медленнее чем если взять и свести эти запросы в один и потом выполнить 1 раз.

поэтому и вопрос: как это сделать при помощи perl+DBI, поскольку где то видел, что DBI такое в отношении к Mysql делать не умеет.

где то даже читал, что мол эта проблема для всех языков программирования, что дескать даже те DBI (к примеру PHP) которые УМЕЮТ выполнять многострочные запросы к БД, на самом деле разбивают их на более составные части по ';' и выполняют по одному запросу....

на практике поимел следующее - попробовал на PHP и все нормально, он понимает такие множественные, составные запросы. И не знаю как он их там выполняет, но все это происходит быстро также как из phpadmin.

Добрые люди скажут - ну и пиши тогда на PHP.... smile
но блин 2 месяца кучу кода писал на perl (поскольку с ним знаком получше) и все работало ОК пока не стала расти БАЗА , 
неужели тут нет никакого выхода кроме как переписать все на PHP????

про 
DBI->prepare я не совсем понял, prepare я делаю для каждого запроса, поскольку они разные, DBI->do пробовал - скорость такая же.
если я чего не так понял, тут лучше примерчик какой в студию. (запросы выполняю на локальном компе, т.е. с сетевыми задержками проблем нет, есть проблема, чтобы все быстрее работало).










--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
vadiml
Дата 29.4.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL Jabber   Вверх
burakov
Дата 30.4.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Спасибо.

попробовал делать prepare как подсказали с вопросиками...

навскидку выигрыш во времени если и есть то очень небольшой... процентов 10-15.
т.е. ракетой скрипт мой не стал... Может конечно теоретически все теперь более правильно, но практически...

не могу сейчас так быстро все на php реализовать.... кучу времени нужно затратить - чтобы сравнить выполнение множественного запроса на php и моего перлового супер prepare... но че то кажется, что сравнение будет не в сторону perl., по крайней мере из phpadmin база быстрее восстанавливается..., а значит надо думать все таки в сторону многострочных запросов.

А все таки может кто подскажет, внешнюю утилиту командной строки для запуска mysql запросов, да еще + как ее настроить на denwer.
кажется будет быстрее если просто сделать 
system "какой-нибудь-mysqlplus \@sql-запрос";






--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
shamber
Дата 30.4.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



burakov, на форум денвера?
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.