2014-10-18 53 views
2

我正在處理一個大型數據庫,我正在尋求能夠加速數據庫的所有事情。問題是:當你在某些領域有獨特的索引時,做一個select請求來檢查它是否正常,或者試試它,並且在條目已經存在的情況下捕獲異常,那麼速度如何?SQL獨特:手動檢查vs捕獲異常

我做了一些研究,但沒有定論。謝謝。

回答

4

手動檢查不會做你認爲它的工作。 (見下面)

如果你先檢查,插入需要兩次往返數據庫。它也可能需要可序列化的事務。

無論如何你必須捕捉錯誤。重複的值只是一個插入時可能出錯的東西;有其他事情可能出錯的lot

我說只是插入,並捕獲錯誤。


INSERT之前的SELECT點是要確定數據庫中是否已經存在一個值。但你不能依靠這個工作。這是爲什麼。

打開兩個終端會話(例如),並連接到您的數據庫。該表已經存在。它是空的。

create table test (
    test_id serial primary key, 
    test_email varchar(15) not null unique 
); 
 
A: begin transaction; 
A: select test_email 
    from test 
    where test_email = '[email protected]'; 
    (0 rows) 

             B: begin transaction; 

A: insert into test (test_email) 
    values ('[email protected]'); 
    INSERT 0 1 

             B: select test_email 
              from test 
              where test_email = '[email protected]'; 
              (0 rows) 
             B: insert into test (test_email) 
              values ('[email protected]'); 
              (waiting for lock) 

A: commit; 

             B: ERROR: duplicate key value 
              violates unique constraint... 
+0

永遠不會想到這種情況。好吧,我會插入並捕獲。謝謝。 – 2014-10-18 16:53:59

1

我的理解是try/catch異常會突然停止程序的流動。即使處理得當。推薦的做法是除域邏輯外使用它們。除非您的數據庫服務器距離很遠,否則額外的選擇不應該那麼糟糕。

3

,你有兩個選擇

  1. 嘗試插入,如果查詢失敗,你會趕上並回滾事務。
  2. 嘗試查詢一次以檢查它是否存在。如果它不存在,請插入該值。

在我看來,第一個更好,因爲你使用網絡連接兩次,如果你查詢兩次。當你有很大的數據時,select也是一個不錯的選擇。 在第一種情況下,您嘗試插入但得到DataIntegrityException。單個請求和響應優於兩個請求和兩個響應。

事務管理器也可以處理異常。