Oracle 9: импорт и экспорт данных в .csv

lu4kiv
Дата: 23.11.2009 19:19:23
Подскажите пожалуйста быстрый способ сделать экспорт данных одной таблицы в файл .CSV. Нужно также сделать импорт.

Проблема состоит в том, что в таблице около 5 миллионов записей и нужен достаточно быстрый механизм, чтобы операция занимала меньше 10 минут.

Пробовал для импорта сделать внешнюю таблицу, хранящуюся в csv-файле, в котором 5 млн строк:

create directory exdir as 'E:\db\';

create table ex_test
        ( inn number,
          name varchar2(250),
          amount number(10, 4),
          turnover number(10, 5)
        )
        organization external
       ( default directory exdir 
         access parameters
         ( records delimited by newline
           fields terminated by ';'
         )
         location ('Test.csv')  
     );

insert into test_inserted 
select * from ex_test; 

Это оказалось неоправданно долго, думаю должны быть другие варианты. Кто может посоветовать?
_Alex_SMIRNOV_
Дата: 23.11.2009 19:24:17
1) sql*plus script: spool file + select + spool off
2) utl_file + select
lu4kiv
Дата: 23.11.2009 19:26:24
_Alex_SMIRNOV_,
Можно немного подробнее?

1 вар-т для экспорта, 2-й для импорта ?
_Alex_SMIRNOV_
Дата: 23.11.2009 19:30:19
lu4kiv
_Alex_SMIRNOV_,
Можно немного подробнее?

1 вар-т для экспорта, 2-й для импорта ?


нет,оба для экспорта, а для имопрта из CSV восользуйтесь утилиткой SQL LOADER или external table....
andrey_anonymous
Дата: 23.11.2009 19:38:38
_Alex_SMIRNOV_
2) utl_file + select

Не вариант.
andrey_anonymous
Дата: 23.11.2009 21:34:39
SQL> desc ane_test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INN                                                NUMBER
 NAME                                               VARCHAR2(250)
 AMOUNT                                             NUMBER(10,4)
 TURNOVER                                           NUMBER(10,5)

SQL> select * from ane_test where rownum < 5;

       INN NAME             AMOUNT   TURNOVER
---------- ------------ ---------- ----------
1000000000 Ratzenberger   1444.485    4.27759
1000000000 Tanon           615.682   -5.47375
1000000000 Frost           410.769   -4.07278
1000000000 Taha             76.614    -5.2683

SQL> select count(*) from ane_test;

  COUNT(*)
----------
   5120000


oracle$ cat export.sql
set linesize 1000
set trimspool on
set echo off
set feedback off
set timing off
set termout off
set pagesize 0
set heading off
spool export.csv
select inn||';"'||name||'";'||to_char(amount,'999999999.99')||';'||to_char(turnover,'999999999.99') from ane_test;
spool off
quit
oracle$ time sqlplus -s table/owner @export.sql

real    5m39.657s
user    3m27.595s
sys     0m13.950s

oracle$ wc -l export.csv
5120000 export.csv

oracle$ head export.csv
1000000000;"Ratzenberger";      1444.49;         4.28
1000000000;"Tanon";       615.68;        -5.47
1000000000;"Frost";       410.77;        -4.07
1000000000;"Taha";        76.61;        -5.27
1000000000;"Scheider";      1404.41;        -2.17
1000000000;"Moorer";       974.34;         9.47
1000000000;"Ledger";      1192.70;          .83
1000000000;"Mazzello";       629.34;         -.40
1000000000;"Dern";      1038.23;        -8.27
1000000000;"Ruffalo";      1318.87;        -7.32

lu4kiv
Дата: 23.11.2009 22:57:49
andrey_anonymous,

Спасибо большое за помощь, все получилось. Полученные результаты по производительности полностью устраивают.
mayton
Дата: 24.11.2009 00:00:28
andrey_anonymous,

А распараллелить не думал? Допустим, что таблица сегментирована по полю NAME на 4 хеш-секции.
andrey_anonymous
Дата: 24.11.2009 00:33:41
mayton, как известно, инициатива наказуема действием.
Попробуйте самостоятельно сформулировать условия, при которых Ваше предложение будет иметь смысл.
mayton
Дата: 24.11.2009 00:43:27
У меня - двухьядерный Athlon, который sqlplus не в состоянии загрузить на 100% простым спулированием. По диску - ресурсы тоже имеются.