2013-04-18 7 views
0

У меня есть текстовый файл, содержащий около 300 миллионов строк. Я делаю объемную вставку, чтобы получить файл в промежуточную таблицу в sql. Затем я вырываю некоторые столбцы, чтобы нормализовать его, что работает отлично и быстро. Последний шаг, который я делаю, - переместить строки из промежуточной таблицы в конечную таблицу. В настоящее время я делаю инструкцию INSERT INTO SELECT, но она берет навсегда. Есть ли способ сделать объемную вставку из выделения?Bulk Insert From Select

ответ

0

Мастер импорта/экспорта, предоставляемый SQL Server Management Studio.

http://www.mssqltips.com/sqlservertutorial/203/simple-way-to-import-data-into-sql-server/

Он будет генерировать и запустить SSIS пакет для вас, который гораздо быстрее и лучше, чем заявление INSERT INTO SELECT.

+0

Я использовал SSIS для этого процесса. Было очень эффективно получать необработанные данные в базу данных, но один раз туда нужно было нормализовать. Узкое место перемещает данные из промежуточной таблицы в окончательную нормализованную таблицу. – user2120910

+0

@ user2120910 SSIS эффективен во всех видах преобразований, но простейшее решение - если у вас уже есть оператор выбора с этапа, который вы можете использовать для вставки - просто используйте этот параметр Select as your SSIS source и передайте пакет этим данным без каких-либо преобразований. –

+0

Я тоже пробовал, похоже, дает те же результаты. Время вставки составляет около 45 минут для 30 миллионов строк. Я смог сократить его с 51 минуты, отключив индексы перед вставкой и восстановив их впоследствии. Возможно, это так быстро, как это получается? – user2120910

-1

Вы можете добавить параллельные подсказки в INSERT.

Смотрите еще несколько вариантов. Например, чтобы отключить любые индексы в целевой таблице http://www.dba-oracle.com/t_insert_tuning.htm

Самое главное, что вы действительно можете сделать эту таблицу ВНЕШНИЙ. Это будет особенно подходящим для вашей спецификации.

Пример Синтаксис:

create table xtern_empl_rpt 
    (empl_id varchar2(3), 
     last_name varchar2(50), 
     first_name varchar2(50), 
     ssn varchar2(9), 
    email_addr varchar2(100), 
     years_of_service number(2,0) 
    ) 
    organization external 

Таким образом, то в сочетании с параллельной подсказкой должны ускорить ваш DML.

insert /*+ parallel */ into tb_b t 
select * from xtern_empl_rpt where <<whatever predicate required>> 

Источник: http://www.orafaq.com/node/848

+0

Вопрос должен иметь с меткой базы данных. Однако в нем упоминается «выбрать» для создания новой таблицы. В Oracle синтаксис «create table as». Я предполагаю, что база данных - это SQL Server, Sybase, Postgres или база данных, основанная на Postgres. –

+0

Хорошая точка. Я предполагал, что Oracle. Виноват. Возможно, слово BULK заставило меня так думать. Однако ваша мысль об этом упоминает «выбрать в», я совсем не видел в исходном сообщении? – user2275460