2013-10-16 29 views
0

我們在數據庫中進行了邏輯刪除,每個表都有一個'已刪除'標誌,它是可以爲空的日期時間字段。何處過濾查詢中的「已刪除」行

Deleted DATETIME NULL 

在我們的疑問,我使用模式:

SELECT * 
FROM TableA a 
INNER JOIN TableB b 
    ON b.id = a.pkid 
    AND b.deleted IS NULL 
INNER JOIN TableC c 
    ON c.id = b.pkid 
    AND c.deleted IS NULL 
WHERE a.deleted IS NULL 

是,更多的效率比:

SELECT * 
FROM TableA a 
INNER JOIN TableB b 
    ON b.id = a.pkid 
INNER JOIN TableC c 
    ON c.id = b.pkid 
WHERE a.deleted IS NULL 
AND b.deleted IS NULL 
AND c.deleted IS NULL 

我明白,當左聯接進入它的parrent變化。我在這裏談論INNER加入。

我認爲第一個效率更高,因爲服務器執行查詢的方式。我找不到我所看到的關於階段的頁面......即先是聯接,然後是何處,然後是訂單,然後是選擇......但是第一個例子會限制數據,然後那裏被觸發,所以WHERE覆蓋的數據較少?

回答

1

,你也可以在添加謂詞到第一加入...

SELECT * 
FROM TableA a 
    JOIN TableB b 
     ON b.id = a.pkid 
     AND a.deleted IS NULL 
     AND b.deleted IS NULL 
    JOIN TableC c 
     ON c.id = b.pkid 
     AND c.deleted IS NULL 

,但在一般情況下,它是不可靠的一個特定語法的方法計數以產生比另一種更好或更差的性能。查詢優化器可以做一些奇怪的事情,通常將兩個截然不同的查詢轉換爲同一個計劃。試試他們兩個,看看查詢計劃,看看會發生什麼。

相關問題