2014-03-31 103 views
0

如果要執行代碼,只有當某行存在時,檢查存在的正確方法是什麼?以前,我使用了不同的方法,對整體性能沒有多少關注......並想知道其他方法之間是否存在顯着差異?SQL「是否存在記錄」

IF EXISTS (SELECT * FROM MYTABLE WHERE...) 

IF (SELECT COUNT(*) FROM MYTABLE WHERE...) > 0 

有沒有比上述更好的方法?

也許有人可以提供推薦的方法,爲什麼這種方法比其他方式更好?

+1

如果您只想知道是否存在行,您爲什麼要計算行數?所以即使執行計劃是相同的,第一種方法更具可讀性。 –

回答

5

dbms很聰明,知道他不需要從EXISTS子句中檢索任何東西。

一個也許老了,但通常的方式是明確的用戶(但不改變執行計劃的任何東西)是使用

if exists (select null from) --or select 1 from 

if exists (select * from) 

不相同。

一個EXISTS子句比你的第二個版本更好地告訴你想要達到什麼。

+1

但這個答案使用'EXISTS'和'COUNT'比較了兩種方法嗎? –

+0

@TimSchmelter現在有點;)但是,我錯過了第一件事。 –

2

exists方法在性能方面更好。當遇到匹配的第一條記錄時,它可以停止處理基礎表/查詢。

count(*)方法必須實際產生記錄數,因此它需要完成基礎表掃描/查詢。然後,它也必須進行聚合。

是的,它們之間可能存在顯着的性能差異。假設你有一張有1億行的桌子,你需要:

if exists (select 1 from table t) 

這將幾乎立即返回。

if (select count(*) from table t) 

必須做一個全表掃描,所以出去喝一杯咖啡。使用exists