Шаг 141 - БД Oracle - SQL*Loader Теория и полезные примеры - ЧАСТЬ V

Для более полной картины работы SQL*Loader, я думаю есть смысл остановиться на том, как данные вообще загружаются в БД Oracle. Существует два способа загрузки данных БД. Обычный (conventional) и прямой (direct). Для того, чтобы активировать прямой метод загрузки необходимо в командной строке указать параметр DIRECT=TRUE. При использовании обычного (conventional) типа загрузки данных, используется SQL оператор INSERT и буферы памяти. В этот момент может возникнуть конкуренция с другими процессами за выделение ресурсов памяти в SGA. Это может привести к замедлению работы загрузчика. Так же неудобство обычного метода может заключатся в том, что SQL*Loader сканирует БД в поисках частично заполненных блоков загружаемой таблицы с целью их заполнения. Это может так же повлиять на загрузку сервера БД в целом. Но есть ряд случаев, при котором conventional метод более предпочтителен, либо вообще единственно возможный! А, именно в следующих случаях:

  1. Если таблица, в которую направляются данные индексированы или к ней имеются обращения из других (помимо загрузки) процессов. А, так же когда происходит удаление или вставка записей в таблицу.
  2. При использовании SQL операторов в контрольном файле.
  3. Если загружаемая таблица является кластерной.
  4. Если загружается небольшое число строк в большую индексированную таблицу и/или, если для таблицы заданы ограничения ссылочной целостности или на значение данных.
  5. Если работа происходит через Net8 или SQL*Net. при этом происходит использование различных платформ и оба узла принадлежат одному семейству компьютеров и использована одна и та же таблица кодировки символов.

Схематично по этапам обычная загрузка происходит следующим образом:

  1. Разнесение элементов входных данных по столбцам базы данных.
  2. Формирование SQL операторов INSERT.
  3. Поиск конца секции табличных данных в памяти.
  4. Работа с кэш-буфером.
  5. Чтение и запись блоков базы данных.

При прямом методе загрузки данных, они формируются непосредственно в БД, без формирования операторов INSERT. При этом данные размещаются в памяти после существующих табличных данных. Этапы, которые имеются при прямом методе следующие:

  1. Разнесение элементов входных данных, по столбцам базы данных.
  2. Поиск концов секции табличных данных в памяти.
  3. Форматирование блоков данных и запись их непосредственно в базу данных.

Вот таким образом происходит прямая загрузка. Как правило я почти не пользовался direct способом, так как вполне хватало обычного метода загрузки, но представлять как это выглядит не помешает. Для простоты картины, я пока пропускаю загрузку во вложенные таблицы и VARRAY массивы. Это отдельная тематика и мы ее еще коснемся! А, пока давайте рассмотрим ряд забавных примеров использования SQL*Loader и его преимуществ! Я буду излагать все теоретически, а вы пробуйте практически, если будут ошибки пишите! Например, очень полезен вот такой примерчик.

Есть вот такой файл данных:

   
   .dat
      
   DEPOSIT     10015  10073
   DEPOSIT     10020   7525
   WITHDRAWAL  10015   2000

Создадим табличку:

CREATE TABLE register (
tx_type CHAR(15),
acct NUMBER,
amt NUMBER
)
/

Затем вот такой контрольный файл:

   .ctl
   
   LOAD DATA
   INFILE 'month.dat'
   INTO TABLE register
   (tx_type POSITION(1:10),
    acct    POSITION(13:17),
    amt     POSITION(20:24)  ":amt/100"
   )

После загрузки получим такое содержимое таблички:

SELECT * FROM register;

TX_TYPE               ACCT        AMT
--------------- ---------- ----------
DEPOSIT              10015     100.73
DEPOSIT              10020      75.25
WITHDRAWAL           10015         20

Просто и полезно! Вот еще примерчик использования последовательности Oracle и предиката USER.

Создадим вот такую последовательность:

CREATE SEQUENCE db_seq
START WITH 1
INCREMENT BY 1
/

Создадим такую табличку:

CREATE TABLE load_db_seq
(
seq_number NUMBER,
username CHAR(30),
data1 NUMBER,
data2 CHAR(15)
)
/

И контрольный файл:

LOAD DATA
INFILE *
INTO TABLE load_db_seq_delimited
FIELDS TERMINATED BY "," TRAILING NULLCOLS
( seq_number "db_seq.nextval", username "USER", data1, data2 )

BEGINDATA
11111,AAAAAAAAAA
22222,BBBBBBBBBB
33333,СССССССССС

А вот содержимое после загрузки:

SELECT * FROM load_db_seq_delimited
/

SEQ_NUMBER  USERNAME   DATA1 DATA2
----------  ---------- ---------------
         1  MILLER     11111 AAAAAAAAAA
         2  MILLER     22222 BBBBBBBBBB
         3  MILLER     33333 СССССССССС

Простенько и со вкусом, думаю будет полезно в дальнейшем для использования - если вспомнить сколько еще переменных в Oracle фантазии могут быть самые разные! Пробуйте! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 14.06.2004