2016-05-05 3 views
1

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

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 часов, чтобы закончить.

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

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

+2

Звучит как сетевая латентность - отдельные операторы будут иметь свои отдельные индивидуальные поездки на сервер, что неэффективно. Но разница звучит немного экстремально. Где находится ваш клиент - в локальной сети? WAN? Доступ через Интернет через VPN? Как долго удаленная версия берет, если вы просто делаете ее блоком, ставя 'begin ... end;' вокруг всего списка вставок? (Кроме того, почему вы делаете 65 000 отдельных вставок в первую очередь - откуда берутся эти значения?) –

+0

Если я положил начало .. конец, включающий вставки, то он запускается (из моей командной строки) в течение 4 часов. Мы подключаем сервер через интернет (как через мою командную строку, так и замазку). Я хотел бы вставить эти значения в таблицу из одного высшего env в env. Я знал, что есть другие способы, как SQL LOADER, загружать их быстро, но я хотел бы понять разницу между двумя приведенными выше исполнениями. –

+0

Я не совсем уверен в причине разницы во времени. Одна вещь, о которой я могу думать, заключается в том, что когда вы получаете доступ к базе данных через шпатлевку, вы заходите на сервер db. Это уменьшает задержку сети (как сказал Алекс). – Invalidsearch

ответ

0

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

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; 
Смежные вопросы