2012-04-20 10 views
3

我希望做一個批量數據從一個表到另一個的串行日誌插入。這只是一次數據遷移的一部分,所以交換分區等不是一個答案。什麼會導致Oracle忽略請求它執行直接路徑加載的APPEND提示?

的SQL將是以下結構:

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

什麼可能導致甲骨文運行這個convential插入,而不是直接路徑插入?

例如,我認爲在表上觸發一個觸發器會導致Oracle進行一個傳統的插入。是否有一個確定的限制列表?

回答

6

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1211797200346279484引述:

「插入/ * +追加* /將忽略附加提示,並使用常規路徑加載,當表引用完整性或觸發...」湯姆 - 凱特

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

直接路徑INSERT受到許多限制。如果任何 這些限制被違反,那麼Oracle數據庫連續執行 傳統的插入不返回任何消息,除非 另有說明:

  • 你可以有多個直接路徑INSERT語句在一個事務中,有或沒有其他DML語句。但是,在一個 DML語句更改特定的表,分區或索引後,事務中的其他任何DML語句都不能訪問該表,分區或 索引。

  • 訪問同一個表,分區或索引的查詢在直接路徑INSERT語句之前被允許,但在它之後不被允許。

  • 如果任何串行或並行語句試圖訪問已經在同一 事務修改通過直接路徑插入一個表格,數據庫返回一個錯誤並拒絕 聲明。

  • 目標表不能是集羣。

  • 目標表不能包含對象類型列。

  • 如果索引組織表(IOT)沒有分區,如果它具有映射表,或者如果它是物化視圖的引用,則不支持直接路徑INSERT。

  • 直接路徑插入到一個索引組織表(IOT)的單個分區,或者到一個分區IOT只有一個分區,將 被連續完成,即使IOT在並行模式或您創建 指定APPEND或APPEND_VALUES提示。但是,只要 不使用分區擴展名稱,並且IOT具有多個 分區,直接路徑INSERT 操作到分區的IOT中將遵循並行模式。

  • 目標表不能在其上定義任何觸發器或參照完整性約束。

  • 目標表不能被複制。

  • 包含直接路徑INSERT語句的事務不能成爲或分佈式。

但是手冊中的名單並不詳盡,並不完全準確。例如,referential integrity constraints do not block direct-path INSERT if that constraint is part of reference partitioning

+0

Tom給出了這些例子,這是一個很好的來源,但我想知道是否還有其他的可能性。例如DEFAULT SYSDATE。當然,我可以嘗試,但我寧願找到一個記錄的答案。 – 2012-04-20 12:13:30

+0

你可以在這裏找到限制:http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9014.htm#SQLRF01604「常規和直接路徑INSERT」下 – 2012-04-20 16:48:30

+0

謝謝 - 這正是我所缺少的。也許編輯到你的答案,因爲它比Tom Kyte鏈接更好。 – 2012-04-21 01:41:16

相關問題