Oracle 11gR2 загружает несколько файлов: sqlldr или внешние таблицы? - PullRequest
5 голосов
/ 01 января 2012

У меня 471 файл на общую сумму около 100 ГБ. Файлы разделены "\ t" с данными транзакций в следующем формате:

char(10) not null,
char(8) not null,
char(1) not null,
char(4) not null,
number not null,
char(1) not null,
char(1) not null,
char(1) not null,
number not null

Порядок транзакций в файлах важен и должен быть сохранен, в идеале с идентификатором первичного ключа. Сначала я загрузил эти файлы с помощью sqlldr, но это занимает очень много времени. Я недавно узнал о внешних таблицах. С стратегической точки зрения, какой метод лучше? Как работает внешний стол? Спасибо.

1 Ответ

3 голосов
/ 02 января 2012

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

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

Однако в следующих ситуациях используйте SQL *Загрузчик для лучшей производительности загрузки:

  • Вы хотите загружать данные удаленно.
  • Преобразования данных не требуются, и данные не должны загружаться параллельно.

Для повышения производительности SQL * Loader были сделаны следующие предложения:

  • Не иметь никаких индексов и / или ограничений (первичных ключей) для ваших таблиц загрузки во времяпроцесс загрузки
  • Добавьте следующую опцию в командной строке: DIRECT = TRUE.Это позволит обойти большую часть обработки СУБД, используя прямой загрузчик пути вместо обычного загрузчика пути.Однако в некоторых случаях вы не можете использовать прямую загрузку.Эти ограничения можно получить из Руководства по серверным утилитам Oracle
  • Использовать данные фиксированной ширины, а не данные с разделителями.Для данных с разделителями необходимо отсканировать каждую запись для определения разделителя
  • Старайтесь избегать преобразований набора символов, поскольку преобразования выполняются как по времени, так и по процессору
  • Для обычного пути используйте параметры READSIZE и BINDSIZE.
    READSIZE будет захватывать большие куски данных за системный вызов чтения.Параметр BINDSIZE указывает размер массива связывания, который, в свою очередь, указывает количество строк, которые будут загружены в пакете

Источник: http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/sql_loader_faq.pdf

...