Эффективно вставляйте большие объемы данных с помощью SQL - PullRequest
4 голосов
/ 07 октября 2011

Привет, мне часто приходится вставлять много данных в таблицу. Например, у меня есть данные из Excel или текстового файла в виде

1,a
3,bsdf
4,sdkfj
5,something
129,else

тогда я часто строю 6 операторов вставки в этом примере и запускаю сценарий SQL. Я обнаружил, что это происходит медленно, когда мне приходится отправлять тысячи небольших пакетов на сервер, это также приводит к дополнительным издержкам в сети.

Какой ваш лучший способ сделать это?

Обновление: я использую ORACLE 10 г.

Ответы [ 3 ]

9 голосов
/ 07 октября 2011

Использовать Внешние таблицы Oracle .

Смотрите также, например,

Простой пример, с которого стоит начать

Вам нужен файл, расположенный в каталоге сервера (познакомьтесь с объектами каталога ):

SQL> select directory_path from all_directories where directory_name = 'JTEST';

DIRECTORY_PATH
--------------------------------------------------------------------------------
c:\data\jtest

SQL> !cat ~/.gvfs/jtest\ on\ 192.168.xxx.xxx/exttable-1.csv
1,a
3,bsdf
4,sdkfj
5,something
129,else

Создать внешнюю таблицу:

create table so13t (
  id number(4),
  data varchar2(20)
)
organization external (
  type oracle_loader
  default directory jtest /* jtest is an existing directory object */
  access parameters (
    records delimited by newline
    fields terminated by ','
    missing field values are null
  )
  location ('exttable-1.csv') /* the file located in jtest directory */
)
reject limit unlimited;

Теперь вы можете использовать все возможности SQL для доступа к данным:

SQL> select * from so13t order by data;

        ID DATA
---------- ------------------------------------------------------------
         1 a
         3 bsdf
       129 else
         4 sdkfj
         5 something
1 голос
/ 07 октября 2011

Я не уверен, что это работает в Oracle, но в SQL Server вы можете использовать SQL-оператор BULK INSERT для загрузки данных из txt или csv-файлов.

BULK
INSERT [TableName]
FROM 'c:\FileName.txt'
WITH 
(
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)
GO

Просто убедитесь, что столбцы таблицы правильносоответствует тому, что в текстовом файле.С более сложным решением вы можете использовать файл формата, см. Следующее: http://msdn.microsoft.com/en-us/library/ms178129.aspx

0 голосов
/ 07 октября 2011

Есть много способов ускорить это.

1) Сделайте это за одну транзакцию. Это ускорит процесс, избегая открытия / закрытия соединения.

2) Загрузка напрямую в виде файла CSV. Если вы загружаете данные в виде файла CSV, операторы «SQL» вообще не требуются. в MySQL операция «LOAD DATA INFILE» выполняет это очень интуитивно и просто.

3) Вы также можете просто записать весь файл в виде текста в таблицу с именем «raw». А затем дайте базе данных разобрать данные самостоятельно, используя триггеры. Это взлом, но он упростит код вашего приложения и уменьшит использование сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...