2014-02-10 40 views
0

(使用Oracle)我有一個包含一列(myCol)的表,它是主鍵。PLSQL - 在插入之前檢查dups的最快方法

在執行插入操作時,在執行插入操作之前檢查select語句還是隻寫入插入操作並讓錯誤處理檢查它會更快?

這樣會更快嗎?

BEGIN 

SELECT count(*) INTO v_count FROM myTbl WHERE myCol = v_newVal; 

IF v_count = 0 THEN 
    INSERT INTO myTbl (myCol) VALUES (v_newVal); 
END IF; 

END; 

or this?

BEGIN 

INSERT INTO myTbl (myCol) VALUES (v_newVal); 

EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
    null; 

END; 

謝謝!

回答

1

在性能方面,肯定是第二個選擇是好。

但是,更重要的是,第一個選項有一個錯誤 - 如果多個會話嘗試同時插入相同的值,它將失敗 - 其中一個會成功,另一個會話將等待首先提交併提升DUP_VAL_ON_INDEX(你還沒有處理)。

1

我想你可以嘗試合併。通常你應該避免重複檢查count()。還有一個提示可以用來忽略重複。這個頁面給出了一個很好的例子。

http://guyharrison.squarespace.com/blog/2010/1/1/the-11gr2-ignore_row_on_dupkey_index-hint.html

+0

你發佈的鏈接表明使用count是最好的方法... – mang

+0

我不同意這一部分,但它的目的是顯示查詢提示的方法,這是所有...當表得到大數可以變得昂貴。除非你的桌子很大,否則計數路線是最簡單的。 – markg

+1

計數可能很昂貴,並且可能會破壞其他未來選擇的緩存,因爲大量記錄將被解析和讀取。 如果你有一個實際的性能問題,只需要count()就可以使它更復雜。 最後,即使你做count(),你仍然需要異常處理,因爲並行性 – odedsh

相關問題