簡體   English   中英

Oracle SQL更新查詢,循環以限制一次更新的行

[英]Oracle SQL Update Query, looping to limit rows updated at a time

我有一個查詢,用於更新新列的所有過去歷史記錄。 它從具有相應ID的源表中提取值。 它還將更新時間與當前時間進行比較,該時間可能會有所變化,但現在保證可以在每一行上運行。

UPDATE table1
SET table1.comment = 
   (SELECT table2.comment
    FROM table2
    WHERE table1.ID = table2.ID)
WHERE(SELECT table2.updateTime
FROM table2
WHERE table1.ID = table2.ID) < sysdate

生產中有數百萬行,我需要將其限制在一個循環中,或者一次只能更新這么多行。 我對SQL相當陌生,還無法找到有關循環如何限制更新的行數的任何文檔。 循環如何得知有關正在使用的表中的行的任何信息?

有兩件事...首先,如果您的表具有主鍵,那么這可能是首選的更新方法:

update (
  select
    t1.comment c1, t2.comment c2
  from
    table1 t1,
    table2 t2
  where
    t1.id = t2.id and
    t2.updateTime < sysdate
)
set
  c1 = c2

其次,假設updateTime意味着我認為的含義,難道它總是小於sysdate嗎? 有理由這樣做嗎?

第三,為減少不必要的更新數量,我認為您可以添加此內容。 假設只有一部分行需要更新,這將極大地影響性能。

update (
  select
    t1.comment c1, t2.comment c2
  from
    table1 t1,
    table2 t2
  where
    t1.id = t2.id and
    t2.updateTime < sysdate and
  ((t1.comment is null and t2.comment is not null) or
   (t1.comment is not null and t2.comment is null) or
    t1.comment != t2.comment)
)
set
  c1 = c2

最后,我並不是說循環永遠不會有幫助,而是說這通常是錯誤的方法。 Oracle已調整為執行此類操作。 如果您的更新查詢很慢,則將其包裝到過程循環中會使其運行得更快,這令人懷疑。 對於調整良好的Oracle數據庫而言,更新數百萬行不是問題。

我了解執行此操作的想法,這在人類世界中很有意義。 我自己嘗試過,只是讓一個聰明的Oracle人告訴我我錯了。 當他調整更新查詢時,事實證明他是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM