| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > DBI execute vs execute_array |
| Автор: Itsys 24.2.2008, 23:02 | ||||||
Вопрос: в таблицу надо вставить, допустим 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 | ||
Да, именно так
|
| Автор: 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 понимает вариант
|
| Автор: shamber 27.2.2008, 14:53 |
| что-то я совсем запутался :0 а на месте ? стоят реальные данные или их потом подставляют когда execute делается? можно пример простенький |
| Автор: ginnie 27.2.2008, 14:56 |
| shamber, если DBD поддерживает server-side placeholders, то лучше данные подставлять в execute() или bind() (а prepare() вызывать один раз до цикла). Если не поддерживает, то без разницы. |
| Автор: ginnie 27.2.2008, 15:51 |
| Itsys, мне кажется, что Вы еще не замеряли, сколько по времени скрипт будет вставлять в базу Ваши 20000-30000 строк. P.S. увеличение размера кода, количества проверок условий и переменных незначительно |
| Автор: Itsys 27.2.2008, 15:58 | ||
| Замерял я сейчас использую
|
| Автор: ginnie 27.2.2008, 16:06 |
| Надо посмотреть timing для текущего кода. Попробовать вариант со вставкой одновременно 10 значений. Посмотреть timing. Почитать DBD::ODBC на предмет server-side placeholders. Если есть возможность, создавать индексы после вставки данных. Посмотреть отличия в timing для вставки данных в виде одной транзакции и для транзакции на каждую вставку. |
| Автор: Itsys 27.2.2008, 17:22 |
| Просто если мне кто-нибудь сказал, что создать массив из 10000 элементов и запихнуть его в execute_array быстрее - я бы сделал. А так - игра не стоит свечь. И результат труда. |