Insert multi-values

Модераторы: kdv, CyberMax

Ответить
Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Insert multi-values

Сообщение Guardian777 » 02 ноя 2011, 11:13

Добрый день.
Нужно конвертировать данные из одной БД в другую с определенными поправками.
Если каждую записьвставлять по типу
INSERT INTO <таблица> ([<Имя столбца>, ... ]) VALUES (<Значение>,...) то файл со скриптом весит 6 мб, в IBExpert есть такая фитча как REINSERT с ней файл получается 1,5 мб.
Вариант типа INSERT INTO <таблица> ([<Имя столбца>, ... ]) VALUES (<Значение>,...) , (<Значение>,...) , (<Значение>,...); не прокатывает. Есть ли способ вставить много записей без повторения INSERT INTO и использования SELECT .. UNION к системным таблицам ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Insert multi-values

Сообщение kdv » 02 ноя 2011, 15:08

если вы пишете код, то используйте параметры. Сначала insert с параметрами, потом данные в параметры и выполняете такой цикл хоть миллион раз.
если скрипт - то нет, insert стандартный.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Insert multi-values

Сообщение Dimitry Sibiryakov » 02 ноя 2011, 15:34

А в чём, собственно, проблема с шестимегабайтным скриптом?

Guardian777
Сообщения: 33
Зарегистрирован: 09 июл 2009, 14:57

Re: Insert multi-values

Сообщение Guardian777 » 02 ноя 2011, 16:58

Проблема в ухудшении работы.
1) Если вставлять кодом то там конечно эффекта с большим избытком данных не создается зато работает это намного медленее чем скрипт, дабы 1 запрос на добавление 47 000 записей быстрее работает чем 47 000 запросов на добавление.
2) Если использовать скрипт то получается никому ненужный избыток данных у меня этот повторяющийся кусок 90 символа при 47 000 записей это примерно 4 мб. А общий объем файла 6 мб. 80% переизбытка пустых и никому ненужных данных. Даже у MYSQL и то есть вставка без дублирования данных о таблице.
3) Сейчас для уменьшения объема скрипта пишу просто INSERT INTO <таблица> VALUES (значения). Без перечисления списка полей получатся 2.3 мб.

P.S. При определенном подходе к жизни проблем вообще никогда и ни с чем не возникает. Так что согласитесь господа что на данный момент в Firebird это реализовано некрасиво. Кстати в трекере висит запись об этом еще с 2008 года...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Insert multi-values

Сообщение kdv » 02 ноя 2011, 21:08

зато работает это намного медленее чем скрипт
явный диссонанс с последующей фразой, что 1 запрос на добавление 47 тысяч записей работает быстрее 47к запросов.
Скрипт - медленнее чем вставка кодом. Почему у вас наоборот - вам разбираться.
даже у MYSQL и то есть вставка без дублирования данных о таблице.
не даже а только, и это не стандарт. ФБ старается следовать стандарту.
Вам 6мб жалко? 6мб, 2 мб... запакуйте скрипт архиватором.
Уменьшить все это вы пытаетесь с какой целью?
Что вы, собственно, делаете - репликацию через скрипт, или что?

Почему нельзя выгнать данные в external table, а потом их на другом конце из External table же и прочитать? Быстрее всяких скриптов и препарированных запросов. И без "избыточных символов".
Так что согласитесь господа что на данный момент в Firebird это реализовано некрасиво. Кстати в трекере висит запись об этом еще с 2008 года...
приоритетность этой фичи ниже плинтуса. кроме того, фича должна все же соответствовать стандарту, а не быть частной отсебятиной.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Insert multi-values

Сообщение Dimitry Sibiryakov » 03 ноя 2011, 16:03

Время, затрачиваемое isql-ем на чтение двух "избыточных" мегабайт неразличимо невооружённым глазом на фоне времени выполнения "необходимых" запросов. И, кстати, у isql есть bulk_insert.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Insert multi-values

Сообщение dimitr » 17 ноя 2011, 13:30

kdv писал(а):не даже а только, и это не стандарт
AFAIK, это давно стандарт и не только в мускуле это есть

Ответить