2009-02-16 31 views
3

我正在考慮在我的代碼中特別沉重的部分進行優化。 它的任務是將統計數據插入到表中。這些數據正在被其他程序打出相當數量。否則,我會考慮使用SQL批量插入等SQL性能 - 更好地插入並引發異常或檢查存在?

所以我的問題是...

它是確定,試圖插入一些數據知道它可能(不要過於頻繁)拋出SQLException的重複行?

比插入前檢查每行更差的異常的性能是否會受到影響?

回答

6

首先,我的建議是寧可正確性的一面,而不是速度。當你完成你的項目和分析表明你丟失了重要的時間檢查插入它們之前存在的行,只有然後優化它。

其次,我認爲如果所有RDBMS中都有重複項,就會有插入和跳過的語法,所以這首先不應該是個問題。我儘量避免將異常作爲正常應用程序流程的一部分,並將其留作真正的特殊情況。也就是說,不要指望數據庫中的異常來解決代碼中的邏輯問題。保持最終(代碼)上的一致性,並讓DB異常僅指示真正的錯誤。

0

是的,我會經常檢查。例如電子郵件地址或IP地址。

如果您擔心性能會使用存儲過程來處理重複的邏輯。

2

我認爲是更好地利用一個存儲過程,以及使用IF

IF(SELECT COUNT(*)FROM X其中Y = Z)= 0 INSERT INTO(X)VALUES( 'XX') ....

,你可以添加一個else條件...

+0

NOT EXISTS是影響查詢的性能(應該是)總是快於計數。 – 2009-02-16 07:43:36

+0

是的,不僅EXISTS測試會比COUNT(*)快,在大表上COUNT(*)會很慢,即使列索引爲 – Kristen 2009-02-16 07:51:33

6

在純粹的性能級別上,插入數據和處理錯誤的速度更快,特別是在錯誤不頻繁的情況下。運行選擇查詢來檢查重複項,處理結果,然後插入(如果成功),將比插入和處理偶然錯誤慢得多。如果它引發一個異常,那麼這將會慢一些,因爲在大多數語言中異常處理速度很慢,但處理異常比任何語言的SQL查詢要快很多倍。按照Assaf的說法,通常還有一種方法可以明確處理重複項,以便完全避免錯誤。這會進一步提高性能,並讓您明確表示您正在以特定方式處理重複項。

是否使用存儲過程取決於您 - 它可以幫助提高性能,但會增加數據庫中的邏輯。這是你必須做出的決定。我對此有過不好的經驗,但它取決於RDBMS和您使用的語言。

0

在這裏可能不太相關的問題。

但是我在一個項目中工作,在此之前以編程方式刪除表格,用於檢查表格是否存在。

當我們開始優化代碼時,我們將其更改爲處理特定的異常,而不是在刪除表之前檢查表的存在。

而且我們有相當多的時間改進,因爲我們在流程流中使用了存在檢查。

有了這樣的思路,我認爲處理異常而不是另一個數據庫查詢檢查成本更低。

2

我沒有看到存儲過程會加速單例插入,除非涉及其他處理。可將eB其他好處雖然 - 保持所有的邏輯一旦放置等

個人,如果有重複等,我會插入和捕獲錯誤

如果你做一個IF NOT EXISTS檢查,然後有條件INSERT有是事務需要鎖定的時間間隔,這可能會增加表上的阻塞。

對於一個忙碌的插入表,值得檢查該表是如何分割的。如果您在身份/自動編號列中插入了羣集PK,則所有插入都位於一端(索引可以具有100%的填充因子),但是如果插入在整個聚簇索引中是隨機的,那麼您可能會從頁面拆分等問題中獲得問題。

一個相關的問題是,在表中的統計數據很可能會很快會過時,而且可以使用緩存查詢計劃等