我們有一個過程,它彙總一些數據並將結果插入另一個表中,我們用它來進行高效的查詢。我們面臨的問題是,我們現在有多個聚合器大致同時運行。如何插入,同時避免與oracle的唯一約束
我們使用原始記錄ID作爲此新表中的主鍵 - 唯一的約束。但是,如果兩個聚合進程同時運行,其中一個進程會因爲唯一的約束違例而出錯。
有沒有辦法指定某種鎖定機制,這將使第二個寫入器等到第一個完成?或者,有沒有辦法告訴oracle忽略該特定的行並繼續其餘的?
不幸的是,將聚合減少到單個進程是不現實的,因爲以下過程依賴於可用數據的最新版本,並且這些過程需要向外擴展。
編輯:
下面是我的[絕密]查詢:
INSERT INTO
agg_table
SELECT
h.id, h.col, h.col2
FROM history h
JOIN call c
ON c.callid = h.callid
WHERE
h.id > (SELECT coalesce(max(id),0) FROM agg_table)
您是否考慮過使用語句級並行機制而不是同時運行多個語句? – 2013-02-18 05:42:56
現在您已經添加了查詢,但我不明白您在同一時間運行其中兩個時所獲得的收益。也許你應該找出哪個id需要在一個select中做,然後爲特定的非重疊範圍發出並行SQL語句。 – 2013-02-18 06:10:11
@WW。通過並行運行該聲明無法獲得任何結果。但是運行sql的過程需要平行,並且需要儘可能新的數據來完成工作。 – 2013-02-18 06:25:28