Oracle обновляет производственную базу данных - PullRequest
2 голосов
/ 22 ноября 2010

Сценарий:

  • У меня есть огромный файл .csv (миллион строк).
  • С помощью sqlldr (загрузчик SQL) мне нужно создать временную таблицу со всеми данными в CSV.
  • После этого я должен выполнить некоторую обработку временной таблицы (обновить некоторые столбцы в верхнем регистре и т. Д.).
  • После обработки мне нужно взять каждую строку из временной таблицы, сделать некоторые дополнительные проверки и вставить эти строки в другую таблицу (интенсивно используемую в производстве).

Как вы предлагаете выполнить всю эту обработку, чтобы я не влиял на общую производительность производственной среды?

(ПРИМЕЧАНИЕ. Я не должен предварительно обрабатывать файл .csv).

Любое предложение будет высоко оценено!

Ответы [ 4 ]

10 голосов
/ 22 ноября 2010

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

create table EXTERNAL_HR_DATA (
    EMPNO    NUMBER(4),
    ENAME    VARCHAR2(10),
    JOB      VARCHAR2(9),
    MGR      NUMBER(4),
    HIREDATE DATE,
    SAL      NUMBER(7,2),
    COMM     NUMBER(7,2),
    DEPTNO   NUMBER(2))
    Organization external
        (type oracle_loader
         default directory testdir
         access parameters (records delimited by newline
                            fields terminated by ‘,’)
         location (‘emp_ext.csv’))
    reject limit 1000;

Это позволит вам читать (но не изменять) данные в вашем файле, используя стандартные операторы SELECT.Затем вы можете ВЫБРАТЬ из внешней таблицы и ВСТАВИТЬ данные в вашу временную таблицу, выполнив хотя бы часть редактирования во время ВСТАВКИ:

INSERT INTO TEMP_HR_DATA
  SELECT EMPNO,
         UPPER(TRIM(ENAME)),
         UPPER(TRIM(JOB)),
         MGR,
         HIREDATE,
         SAL,
         COMM,
         DEPTNO
    FROM EXTERNAL_HR_DATA;

Поделитесь и наслаждайтесь.

2 голосов
/ 22 ноября 2010

На самом деле вы можете сделать немало постобработки в SQL * Loader при загрузке файла.Это может уменьшить некоторую нагрузку на базу данных, поскольку обновление временной таблицы может быть медленным и создавать большое количество повторов / отмен / любых других действий.

2 голосов
/ 22 ноября 2010

Проверьте, достаточно ли в вашей базе данных дискового пространства и не слишком ли сильно загружены ее ОЗУ / ЦП.

Если все в порядке: просто сделайте это.Миллион строк не впечатляет.Загрузка файла в рабочую таблицу не похожа на то, что обычно влияет на производительность.Вы можете сделать to_upper () в вашем контрольном файле sqlldr (сохранит обновление на рабочем столе).Может быть, есть дополнительная постобработка, которую можно выполнить при загрузке?

Внешняя таблица (как предложено в другом ответе) также работает нормально, но у нее нет другого преимущества, кроме как сэкономить место на диске, хотядействительно создает некоторые дополнительные трудности при настройке (создание каталога, предоставление доступа, передача файла на сервер БД).

1 голос
/ 22 ноября 2010

Вы можете загрузить данные и выполнить обработку в базу данных CERT. Когда вы закончите обработку временной таблицы, переместите ее в PROD с экспортом / импортом (datapump) или по ссылке в базе данных. Затем внесите вкладку в таблицу PROD. Это позволит вам обрабатывать данные без какого-либо влияния на PROD. Вставки должны быть сделаны в PROD, чтобы минимизировать влияние, вы должны взглянуть на любые триггеры / ограничения / индексы, которые можно отключить / удалить во время вставок, если вы думаете, что это будет иметь большое значение.

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