Что может заставить Oracle игнорировать подсказку добавления, требующую от него выполнения прямой загрузки пути?


Я хочу сделать последовательную, регистрирующую вставку массовых данных из одной таблицы в другую. Это когда-то было частью миграции данных, поэтому замена разделов и т. д. не является ответом.

SQL будет иметь следующую структуру:

INSERT /*+ APPEND */ ... SELECT FROM ....

Что может заставить Oracle запустить эту условную вставку, а не вставку прямого пути?

Например, я считаю, что наличие триггера на столе заставит Oracle выполнить обычную вставку. Есть ли окончательный список ограничения?

1 3

1 ответ:

Цитата из http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1211797200346279484 :

"insert /*+ append * / игнорирует подсказку append и использует обычную загрузку пути, когда таблица имеет ссылочную целостность или триггер...- Том Кайт

Из https://docs.oracle.com/cd/E18283_01/server.112/e17118/statements_9014.htm#sthref6486

Вставка прямого пути подчиняется ряду ограничений. Если таковые имеются эти ограничения нарушаются, после чего выполняется Oracle Database обычная вставка последовательно без возврата какого-либо сообщения, если только в противном случае отмечается:

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

  • Запросы, которые доступ к одной и той же таблице, разделу или индексу разрешен до инструкции Direct-path INSERT, но не после нее.

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

  • Целевая таблица не может принадлежать кластеру.

  • Целевая таблица не может содержать тип объекта столбцы.

  • Вставка прямого пути не поддерживается для таблицы, организованной по индексу (IOT), если она не секционирована, если она имеет таблицу сопоставления или если она является ссылка на материализованный вид.

  • Вставка прямого пути в одну секцию индексно-организованной таблицы (IOT) или в секционированную IOT только с одной секцией будет быть сделано последовательно, даже если IOT был создан в параллельном режиме или вы укажите подсказку APPEND или APPEND_VALUES. Однако, вставка прямого пути операции в секционированном IOT будут выполняться в параллельном режиме до тех пор, пока расширенное имя раздела не используется, и IOT имеет более одного имени. раздел.

  • В целевой таблице не могут быть определены триггеры или ограничения ссылочной целостности.

  • Целевая таблица не может быть реплицирована.

  • Транзакция, содержащая инструкцию INSERT прямого пути, не может быть распределена или стать распределенной.

Однако приведенный в руководстве список не является исчерпывающим и не является полностью точным. Например, ограничения ссылочной целостности не блокируют вставку прямого пути, если это ограничение является частью ссылочного разбиения .