Загрузчик Oracle SQL * работает в прямом режиме намного медленнее, чем обычная загрузка пути - PullRequest
5 голосов
/ 17 августа 2011

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

Несколько фактов о проблеме:

  • Количество записей взагрузка составляет 60 КБ.
  • Количество записей в целевой таблице до загрузки составляет 700 млн.
  • Версия Oracle - 11g r2.
  • Файл данных содержит дату, символ (ASCII, преобразование не требуется), целое число, число с плавающей запятой.Нет blob / clob.
  • Таблица разделена по хешу.Функция хеширования аналогична PK.
  • Параллельно таблицы установлено значение 4, а на сервере установлено 16 процессоров.
  • Индекс разделен локально.Параллель индекса (из ALL_INDEXES) равна 1.
  • В целевой таблице только 1 PK и 1 индекс.Ограничение PK, построенное с использованием индекса.
  • Проверка разделов индекса показала, что распределение записей по разделам довольно равномерное.
  • Файл данных с разделителями.
  • Используется опция APPEND.
  • Выбор и удаление загруженных данных через SQL выполняется довольно быстро, почти мгновенно.

При обычном пути загрузка завершается примерно за 6 секунд.

С прямым путемзагрузка, загрузка занимает около 20 минут.Худший запуск занимает 1,5 часа, но сервер вообще не был занят.

Если включен skip_index_maintenance, прямая загрузка пути завершается через 2-3 секунды.

Я пробовал довольно многоопций, но ни один из них не дает заметного улучшения ... НЕОБХОДИМЫЕ, Сортированные индексы, MULTITHREADING (я запускаю SQL * Loader на сервере с несколькими процессорами).Ни один из них не улучшает ситуацию.

Вот событие ожидания, которое я продолжал видеть в течение времени, когда SQL * Loader работает в прямом режиме:

  • Событие: последовательное чтение файла БД
  • P1 / 2/3: file #, block #, blocks (проверьте по dba_extents, что это индексный блок)
  • Класс ожидания: пользовательский ввод / вывод

Кто-нибудьесть идеи, что пошло не так с прямой загрузкой пути?Или я могу еще что-нибудь проверить, чтобы действительно выявить причину проблемы?Заранее спасибо.

1 Ответ

3 голосов
/ 17 августа 2011

Полагаю, ты упал из этой птицы

"При загрузке относительно небольшого количества строк в большую индексированную таблицу

Во время прямой загрузки пути существующий индекс копируется, когда он объединяется с новыми ключами индекса. Если существующий индекс очень велик, а количество новых ключей очень мало, то время копирования индекса может компенсировать время, сэкономленное прямой загрузкой пути. "

от того, когда использовать обычный путь. Загрузить в: http://download.oracle.com/docs/cd/B14117_01/server.101/b10825/ldr_modes.htm

...