我正在處理一個大型數據庫,我正在尋求能夠加速數據庫的所有事情。問題是:當你在某些領域有獨特的索引時,做一個select請求來檢查它是否正常,或者試試它,並且在條目已經存在的情況下捕獲異常,那麼速度如何?SQL獨特:手動檢查vs捕獲異常
我做了一些研究,但沒有定論。謝謝。
我正在處理一個大型數據庫,我正在尋求能夠加速數據庫的所有事情。問題是:當你在某些領域有獨特的索引時,做一個select請求來檢查它是否正常,或者試試它,並且在條目已經存在的情況下捕獲異常,那麼速度如何?SQL獨特:手動檢查vs捕獲異常
我做了一些研究,但沒有定論。謝謝。
手動檢查不會做你認爲它的工作。 (見下面)
如果你先檢查,每插入需要兩次往返數據庫。它也可能需要可序列化的事務。
無論如何你必須捕捉錯誤。重複的值只是一個插入時可能出錯的東西;有其他事情可能出錯的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...
我的理解是try/catch異常會突然停止程序的流動。即使處理得當。推薦的做法是除域邏輯外使用它們。除非您的數據庫服務器距離很遠,否則額外的選擇不應該那麼糟糕。
,你有兩個選擇
在我看來,第一個更好,因爲你使用網絡連接兩次,如果你查詢兩次。當你有很大的數據時,select也是一個不錯的選擇。 在第一種情況下,您嘗試插入但得到DataIntegrityException。單個請求和響應優於兩個請求和兩個響應。
事務管理器也可以處理異常。
永遠不會想到這種情況。好吧,我會插入並捕獲。謝謝。 – 2014-10-18 16:53:59