Страница 1 из 1

Insert multi-values

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

Re: Insert multi-values

Добавлено: 02 ноя 2011, 15:08
kdv
если вы пишете код, то используйте параметры. Сначала insert с параметрами, потом данные в параметры и выполняете такой цикл хоть миллион раз.
если скрипт - то нет, insert стандартный.

Re: Insert multi-values

Добавлено: 02 ноя 2011, 15:34
Dimitry Sibiryakov
А в чём, собственно, проблема с шестимегабайтным скриптом?

Re: Insert multi-values

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

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

Re: Insert multi-values

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

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

Re: Insert multi-values

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

Re: Insert multi-values

Добавлено: 17 ноя 2011, 13:30
dimitr
kdv писал(а):не даже а только, и это не стандарт
AFAIK, это давно стандарт и не только в мускуле это есть