我有兩個表ORDERS和ORDER_TEMP,兩者在結構上相同。 ORDER_ID是這兩個表中的主鍵。使用另一個表中的值更新Oracle表
現在,我必須從ORDER_TEMP表中的值更新ORDER表中的KEY_ID列。
這兩個表中有超過百萬條記錄。
如果我把where子句中的ORDER表並運行它沒有工作一個訂單,但如果我做了它運行下去整個表,並沒有奏效。
請幫
我有兩個表ORDERS和ORDER_TEMP,兩者在結構上相同。 ORDER_ID是這兩個表中的主鍵。使用另一個表中的值更新Oracle表
現在,我必須從ORDER_TEMP表中的值更新ORDER表中的KEY_ID列。
這兩個表中有超過百萬條記錄。
如果我把where子句中的ORDER表並運行它沒有工作一個訂單,但如果我做了它運行下去整個表,並沒有奏效。
請幫
假設你的意圖是隻更新ORDER
表中的行,其中有在ORDER_TEMP
表匹配以及其中KEY_ID
是不同的,而忽略了一個事實,即ORDER
是無效的表名,我會先從確保您只更新表,你希望修改
UPDATE ORDER
SET KEY_ID = (SELECT KEY_ID
FROM ORDER_TEMP
WHERE ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID
and ORDER_TEMP.PNP_GROUP=99)
WHERE EXISTS(SELECT 1
FROM order_temp
WHERE ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID
and ORDER_TEMP.PNP_GROUP=99
and order_temp.key_id != order.key_id)
行的不到20%,如果KEY_ID
可以在兩個表是NULL
,你需要ŧ o調整EXISTS
子句中的不等式比較。
如果這樣不能解決問題,我們需要從當前查詢計劃和可用索引開始的更多信息。
這是一個好的開始,但是我們確實需要更多的信息來確保我們給出了正確的答案。最好在子查詢中不要有兩列,因爲即使你只選擇了1個索引,從第一個索引的結果中搜索第二個索引,這會減慢速度。 – FlyingGuy 2015-02-08 19:07:29
「沒有工作」是否意味着有錯誤?或者你只是厭倦了等待查詢完成?如果沒有錯誤並且這只是查詢性能問題,那麼查詢計劃是什麼?哪些索引可用?在放棄之前等待查詢運行了多久?你正在更新ORDER表中的哪一行? – 2012-08-15 00:03:33
花了超過45分鐘,在我放棄之前仍在處理中。我正在嘗試更新訂單表中的200,000條記錄。這兩個表格都有索引。 – acadia 2012-08-15 00:06:02
什麼是查詢計劃?哪些索引可用?在ORDER表中定義了什麼觸發器?既然你沒有'WHERE'子句,你的查詢會更新'ORDER'表中的每一行 - 我假設你說的是你真的想更新少於20%的行,對吧?正如所寫的,'UPDATE'語句將'ORDER_TEMP'中沒有匹配行的'ORDER'中的任何一行的'KEY_ID'設置爲'NULL'。我認爲這不是你所希望的? – 2012-08-15 00:14:30