2011-09-05 29 views
0

在以下查詢中,僅對title_deed_no搜索條件才需要連接到表title_deed,並且未從中選擇任何字段。如果@titleDeedNumber參數爲null,是否還會執行連接?無論如何,這會對性能產生多大的影響?我試圖替換動態生成的大型醜陋T-SQL字符串,並且只有在提供了值title_deed_no時纔會添加聯接的代碼。如果不需要,SQL Server 2008會優化聯接嗎?

DECLARE @registrarId nchar(1) 
DECLARE @titleDeedNumber nvarchar(50) 

SELECT TOP 100 
     vw.* 
FROM ACC.dbo.vw_Property_Nad vw 
     INNER JOIN title_deed td ON (@titleDeedNumber IS NULL) 
            OR (td.Prop_ID = vw.prop_id) 
WHERE vw.Prop_ID IS NOT NULL 
     AND Registrar = isnull(@registrarId, vw.Registrar) 
     AND td.title_deed_no = isnull(@titleDeedNumber, td.title_deed_no) 

我試圖examning的執行計劃,但它僅僅是太忙從視圖加入,我寧願反正得到專家的意見。

+1

消除連接時對性能的影響取決於 - 連接代表的總體成本佔多少?爲什麼不做'LEFT OUTER JOIN'並且在ON子句中包含'title_deed_no'檢查而不是'WHERE',而不是'INNER JOIN'?如果計劃太忙,爲什麼不用一個更簡單的視圖或表重建類似的場景? –

+0

如果你沒有加入條件(就像@titleDeedNumber爲NULL時)不會和CROSS JOIN一樣嗎? – Magnus

回答

2

在這種情況下,可能不是。

你有更好:

  • 一個的存在不是JOIN(即半連接不相等聯接)
  • (vw.Registrar = @registrarId OR @registrarId IS NULL)
  • 同上,用於td.title_deed_no在EXISTS

另外

  • TOP無訂單BY是無用的
  • 您的連接條件意味着CROSS JOIN - >您需要DISTINCT才能使其工作
  • vw隱含視圖 - >查詢比您期望的要複雜。視圖是一個可擴展

我還考慮IF或UNION ALL

SELECT 
     vw.* 
FROM ACC.dbo.vw_Property_Nad vw 
WHERE vw.Prop_ID IS NOT NULL 
     AND (vw.Registrar = @registrarId OR @registrarId IS NULL) 
     AND @titleDeedNumber IS NULL 
UNION ALL 
SELECT 
     vw.* 
FROM ACC.dbo.vw_Property_Nad vw 
WHERE vw.Prop_ID IS NOT NULL 
     AND (vw.Registrar = @registrarId OR @registrarId IS NULL) 
     AND @titleDeedNumber IS NOT NULL 
     AND EXISTS (...) 
ORDER BY something 
+0

感謝您的有用輸入。但是,我不能使用UNION建議,因爲'@ titleDeedNumber'只是少數這樣的標準中的第一個。 – ProfK

1

我不知道你想要的加盟被優化掉的宏。這意味着,如果提供了參數並且緩存的計劃與NULL(反之亦然)存儲在一起,則根據參數您將至少有兩個不同的計劃,這意味着它不會是最優的(或可能甚至是有效的)。如果這是您最終想要實現的目標,那麼應該有兩個不同的存儲過程,並根據參數是否填充來讓應用程序決定要調用哪一個。

但只有在實際觀察到重大計劃/性能差異時才這樣做。正如@gbn所說的,我懷疑你會在這種情況下看到巨大的性能差異,除非標題行爲表很龐大且沒有索引(或沒有最佳索引)。典型的做法是比較值或檢查值是否爲NULL。即使只有一個可選參數,多程序方法的維護通常也很少,而且只需要一個以上的可選參數。

對於非常好的背景閱讀,請查看Erlan Sommarskog關於Dynamic Search Conditions2008-specific version)的文章。

+0

感謝您的文章。看起來像一個很好的閱讀。順便說一下,標題表格很大,在7.5米行,但看起來索引確定,而不是奇怪的巨大。 – ProfK