如果要執行代碼,只有當某行存在時,檢查存在的正確方法是什麼?以前,我使用了不同的方法,對整體性能沒有多少關注......並想知道其他方法之間是否存在顯着差異?SQL「是否存在記錄」
IF EXISTS (SELECT * FROM MYTABLE WHERE...)
IF (SELECT COUNT(*) FROM MYTABLE WHERE...) > 0
有沒有比上述更好的方法?
也許有人可以提供推薦的方法,爲什麼這種方法比其他方式更好?
如果要執行代碼,只有當某行存在時,檢查存在的正確方法是什麼?以前,我使用了不同的方法,對整體性能沒有多少關注......並想知道其他方法之間是否存在顯着差異?SQL「是否存在記錄」
IF EXISTS (SELECT * FROM MYTABLE WHERE...)
IF (SELECT COUNT(*) FROM MYTABLE WHERE...) > 0
有沒有比上述更好的方法?
也許有人可以提供推薦的方法,爲什麼這種方法比其他方式更好?
dbms很聰明,知道他不需要從EXISTS子句中檢索任何東西。
一個也許老了,但通常的方式是明確的用戶(但不改變執行計劃的任何東西)是使用
if exists (select null from) --or select 1 from
但
if exists (select * from)
不相同。
一個EXISTS
子句比你的第二個版本更好地告訴你想要達到什麼。
但這個答案使用'EXISTS'和'COUNT'比較了兩種方法嗎? –
@TimSchmelter現在有點;)但是,我錯過了第一件事。 –
exists
方法在性能方面更好。當遇到匹配的第一條記錄時,它可以停止處理基礎表/查詢。
count(*)
方法必須實際產生記錄數,因此它需要完成基礎表掃描/查詢。然後,它也必須進行聚合。
是的,它們之間可能存在顯着的性能差異。假設你有一張有1億行的桌子,你需要:
if exists (select 1 from table t)
這將幾乎立即返回。
if (select count(*) from table t)
必須做一個全表掃描,所以出去喝一杯咖啡。使用exists
。
如果您只想知道是否存在行,您爲什麼要計算行數?所以即使執行計劃是相同的,第一種方法更具可讀性。 –