Объемная Вставка в базу данных Oracle: Который лучше: ДЛЯ цикла Курсора или простого Выбора?

Узнайте, какую версию django вы используете (, спасибо @BradyEmerso n):

python -c "import django; print(django.get_version())"

Если старше 1,8:

pip install --upgrade django

23
задан blong 13 September 2011 в 17:12
поделиться

4 ответа

Я бы порекомендовал выбрать вариант, потому что курсоры занимают больше времени.
Кроме того, использование функции «Выбрать» намного проще для понимания тем, кому нужно изменить ваш запрос

30
ответ дан 29 November 2019 в 01:01
поделиться

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

Однако, если вам нужно добавить больше процедурной логики (по какой-то причине), вам может потребоваться использование PL / SQL, но вы должны использовать массовые операции вместо построчной обработки. (Примечание: в Oracle 10g и более поздних версиях ваш цикл FOR будет автоматически использовать BULK COLLECT для выборки 100 строк за раз; однако ваш оператор вставки по-прежнему будет выполняться построчно).

например

DECLARE
   TYPE tA IS TABLE OF FOO.A%TYPE INDEX BY PLS_INTEGER;
   TYPE tB IS TABLE OF FOO.B%TYPE INDEX BY PLS_INTEGER;
   TYPE tC IS TABLE OF FOO.C%TYPE INDEX BY PLS_INTEGER;
   rA tA;
   rB tB;
   rC tC;
BEGIN
   SELECT * BULK COLLECT INTO rA, rB, rC FROM FOO;
   -- (do some procedural logic on the data?)
   FORALL i IN rA.FIRST..rA.LAST
      INSERT INTO BAR(A,
                      B,
                      C)
      VALUES(rA(i),
             rB(i),
             rC(i));
END;

Вышеуказанное имеет преимущество минимизации переключений контекста между SQL и PL / SQL. Oracle 11g также имеет лучшую поддержку таблиц записей, так что вам не нужно иметь отдельную таблицу PL / SQL для каждого столбца.

Кроме того, если объем данных очень велик,

22
ответ дан 29 November 2019 в 01:01
поделиться

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

5
ответ дан 29 November 2019 в 01:01
поделиться

Простая вставка / выбор, такая как ваш второй вариант, намного предпочтительнее. Для каждой вставки в 1-м варианте вам потребуется переключение контекста с pl / sql на sql. Запустите каждый из них с помощью trace / tkprof и проверьте результаты.

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

5
ответ дан 29 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: