Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > DBI execute vs execute_array


Автор: Itsys 24.2.2008, 23:02
Вопрос: в таблицу надо вставить, допустим 10000 однотипных строк
Код

INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?)


Что лучше использовать
Код

execute
execute
execute
execute
execute
и т.д.

или
Код

execute_array - один раз на все 10000 строк


Автор: ginnie 25.2.2008, 11:44
Itsys, создавать массив из 10000 строк, думаю, не лучший вариант. С точки зрения быстродействия, оба варианта одинаковы. Для увеличения быстродействия необходимо вставлять несколько строк в одном запросе.

Автор: vadiml 26.2.2008, 20:52
Можно в 1 INSERT'e передавать данные сразу для нескольких записей

такой вариант будет работает быстрее и execute для 1 записи, и execute_array

Автор: Itsys 26.2.2008, 20:56
Несколько записей, это как?
INSERT
INSERT
INSERT

Автор: ginnie 26.2.2008, 22:04
Да, именно так

Код

/*#1*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#2*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#3*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#4*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#5*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#6*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#7*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#8*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#9*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);
/*#10*/ INSERT INTO Table (Param1, Param2, Param3, Param4, Param5, Param6, Param7) VALUES (?, ?, ?, ?, ?, ?, ?);

Автор: Itsys 26.2.2008, 22:07
Проблема в том, что что либо INSERT будет производится при чтении очередной строки из файла, либо в конце чтения скопом.... промежуточные вставка по 10, 20, 30 строк - мне кажется смысла не имеют, только увеличивают размер кода, количество проверок условий и переменных.

Автор: ramus 26.2.2008, 22:39
Я пробовал вставлять записи в БД ORACLE по разному, но разницы ни в производительности, ни со стороны оракла (кол-во execute на сессию) не увидел. Такое подозрение, что у перл драйвер оракла подменяет все на одиночный инсерт (не умеет работать с bulk коллекцией). 
Для себя решил: если надо грузить большие объемы данных (сотни тысяч строк - более 100МБ данных), то лучше на перле если надо обработать входной файл для sqlloader (утилита от оракла) и затем загрузить его этой утилитой. Разница во времени работы различается на порядок!!!

Автор: Itsys 26.2.2008, 23:48
У меня MS SQL... да и данных ну максимум 20000-30000 строк

Автор: vadiml 27.2.2008, 14:35
Несколько записей -- это
INSERT INTO Table (field1, field2, field3, field4, field5, field6, field7)
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?);

Большинство баз такое понимает

Автор: ginnie 27.2.2008, 14:42
vadiml, MySQL понимает вариант

Код

INSERT INTO Table (field1, field2, field3, field4, field5, field6, field7)
VALUES (?, ?, ?, ?, ?, ?, ?), 
(?, ?, ?, ?, ?, ?, ?), 
(?, ?, ?, ?, ?, ?, ?), 
(?, ?, ?, ?, ?, ?, ?), 
(?, ?, ?, ?, ?, ?, ?);

Автор: shamber 27.2.2008, 14:53
что-то я совсем запутался :0 а на месте ? стоят реальные данные или их потом подставляют когда execute делается?
можно пример простенький

Автор: ginnie 27.2.2008, 14:56
shamber, если DBD поддерживает server-side placeholders, то лучше данные подставлять в execute() или bind() (а prepare() вызывать один раз до цикла). Если не поддерживает, то без разницы.

Автор: Itsys 27.2.2008, 15:27
По поводу
Цитата(vadiml @  27.2.2008,  14:35 Найти цитируемый пост)
INSERT INTO Table (field1, field2, field3, field4, field5, field6, field7)
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?), 
VALUES (?, ?, ?, ?, ?, ?, ?);


Я уже писал...

Цитата(Itsys @  26.2.2008,  22:07 Найти цитируемый пост)
Проблема в том, что что либо INSERT будет производится при чтении очередной строки из файла, либо в конце чтения скопом.... промежуточные вставка по 10, 20, 30 строк - мне кажется смысла не имеют, только увеличивают размер кода, количество проверок условий и переменных. 



Автор: ginnie 27.2.2008, 15:51
Itsys, мне кажется, что Вы еще не замеряли, сколько по времени скрипт будет вставлять в базу Ваши 20000-30000 строк.

P.S. увеличение размера кода, количества проверок условий и переменных незначительно  smile 

Автор: Itsys 27.2.2008, 15:58
Замерял  smile почти 17000 - 145 сек., вопрос - можно ли сократить это время или нет...
я сейчас использую
Код

prepare
а потом на каждую строку файла
execute
execute
execute


Автор: ginnie 27.2.2008, 16:06
Надо посмотреть timing для текущего кода.
Попробовать вариант со вставкой одновременно 10 значений. Посмотреть timing.
Почитать DBD::ODBC на предмет server-side placeholders.
Если есть возможность, создавать индексы после вставки данных.
Посмотреть отличия в timing для вставки данных в виде одной транзакции и для транзакции на каждую вставку.

Автор: Itsys 27.2.2008, 17:22
 smile Хе это все понятно..... я думал может кто уже сталкивался с таким вопросом.... и может сказать быстрее или нет... А так, принципиально большой разницы +- 1 минута нет - поэтому даже насчет вставки блоками по 10 строк не хочется заморачиваться.

Просто если мне кто-нибудь сказал, что создать массив из 10000 элементов и запихнуть его в execute_array быстрее - я бы сделал. А так - игра не стоит свечь. И результат труда.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)