如果我加入一個表像這樣B表...當連接到返回false的變量時,SQL Server甚至會查看錶嗎?
select A.* from A
left outer join B on A.Id = B.aId and @param = 'someValue'
和@參數不等於「someValue中」,並SQL服務器甚至嘗試匹配從表B中的記錄還是足夠聰明,知道這種情況永遠不會是真的?
如果我加入一個表像這樣B表...當連接到返回false的變量時,SQL Server甚至會查看錶嗎?
select A.* from A
left outer join B on A.Id = B.aId and @param = 'someValue'
和@參數不等於「someValue中」,並SQL服務器甚至嘗試匹配從表B中的記錄還是足夠聰明,知道這種情況永遠不會是真的?
因此,儘管在特定的環境下,你可能會發現,當@參數具有不同的值,則外連接表可能永遠探測,你不應該依賴於它的正確性。請注意,探針意味着在表格中搜索實際值。元數據信息將總是進行檢查。例如,你不能作弊並要求加入一個不存在的表。
尤其是,不要試圖創建一個查詢裏應該有兩個不同的人(一個連接,一個沒有)。
令人印象深刻的答案! – cdonner 2009-12-08 01:18:09
它更容易把這個代碼放在一個新的答案,而不是評論,但是這顯示了一點什麼萊姆斯是說:
CREATE PROCEDURE dbo.Test_Params
@param1 INT
WITH RECOMPILE
AS
BEGIN
SELECT
o.object_id,
c.object_id
FROM
sys.objects o
LEFT OUTER JOIN sys.columns c ON
c.object_id = o.object_id AND
@param1 = 1
OPTION
(RECOMPILE)
END
GO
EXEC dbo.Test_Params 1
EXEC dbo.Test_Params 2
如果你對兩個EXEC語句的執行計劃,你會看到sys.columns出現在兩個執行計劃中,但第二個行在連接發生之前都被過濾了。請注意,儘管如此,它們並未從查詢中完全短路。
爲什麼你會永遠這樣做呢?或者它只是一個假設? – 2009-12-08 03:05:56
我試圖找到編寫一個查詢,其標準可能存在的15種不同的表取決於其指示表中的參數的有效方式。 – adam0101 2009-12-08 14:33:54
聽起來像這是你的根源問題,這只是一個症狀。什麼樣的查詢跨越15個不同的實體? – 2009-12-08 14:38:21