Вставить операторы в Oracle

У меня есть сценарий SQL, как показано ниже, который состоит из 65000 операторов вставки.

SET DEFINE OFF;
SET AUTOCOMMIT 1000;
SET FEEDBACK OFF;

Insert into table (col1,..col20) values ('val1',...'val2');
Insert into table (col1,..col20) values ('val1',...'val2');
...
...

Когда я запускаю этот скрипт через sqlplus через командную строку (sqlplus usr/pwd@DB @script.sql), мне потребовалось около 4 часов.

Но когда я запускаю тот же скрипт, регистрируясь в putty, подключающемся к серверу, и запускаю скрипт через sqlplus (sqlplus usr/pwd@DB @script.sql), это занимает всего одну минуту.

Не могли бы вы сообщить мне, почему эта разница вызвана


person Vinoth Karthick    schedule 05.05.2016    source источник
comment
Звучит как сетевая задержка - все отдельные операторы будут иметь свои собственные индивидуальные обращения к серверу, что неэффективно. Но разница звучит немного резко. Где находится ваш клиент - в локальной сети? WAN? Доступ через Интернет через VPN? Сколько времени займет удаленная версия, если вы просто сделаете ее блоком, поставив begin ... end; вокруг всего списка вставок? (Кроме того, почему вы вообще делаете 65 000 отдельных вставок — откуда берутся эти значения?)   -  person Alex Poole    schedule 05.05.2016
comment
Если я поставлю начало.. конец, заключающий операторы вставки, тогда он будет работать (из моей командной строки) в течение 4 часов. Мы подключаемся к серверу через Интернет (как через мою командную строку, так и через шпатлевку). Я хотел вставить эти значения в таблицу из одной более высокой среды в среду разработки. Я знал, что есть другие способы, такие как SQL LOADER, чтобы быстро загрузить его, но я хотел бы понять разницу между двумя приведенными выше выполнениями.   -  person Vinoth Karthick    schedule 05.05.2016
comment
Я не совсем уверен в причине разницы во времени. Одна вещь, о которой я могу думать, это то, что когда вы получаете доступ к базе данных через шпатлевку, вы входите на сервер базы данных. Это уменьшает задержку сети (как упоминал Алекс).   -  person Invalidsearch    schedule 05.05.2016
comment
Вы также можете попробовать одинарную вставку. Это будет быстрее, чем отдельные вставки. с data_set (col1, col2) as (выберите 'val1', val2 из двойного объединения, все выберите 'val1', val2 из двойного объединения, все выберите 'val1', val2 из двойного) вставьте в таблицу выберите * из data_set;   -  person Invalidsearch    schedule 05.05.2016


Ответы (1)


Вы также можете попробовать одинарную вставку. Это будет быстрее, чем отдельные вставки.

with data_set (col1, col2)
as (select 'val1', val2 from dual union all 
select 'val1', val2 from dual union all 
select 'val1', val2 from dual) 
insert into table select * from data_set;
person Invalidsearch    schedule 05.05.2016