2016-07-18 60 views
0

我想建立一個基本上做兩件事的視圖,表1中的記錄是否在表2中以及是否有到另一個表的鏈接仍然存在。它處理數據的一個子集,但是當我試圖運行完整查詢時,它在視圖設計器中超時。SQL查看優化

該視圖工作正常,直到我在檢查中添加到另一個表的鏈接是否存在。

最初,它連接表A至表B和過濾掉其中A.ID ID列表B中wasnt本

我然後告知,如果人與地址表之間的鏈接(存儲在表C)被刪除,那麼除了再次獲得該表的完整摘錄並查看哪些鏈接不再存在之外,我們無法知道。我試圖使用檢查,以確定

我用以下結構接近60倍選擇是否在列中顯示的信息是否在特定的列中顯示的一些數據:

Column1 = case when exists (select LinkID from LinkTable C 
      where cast(C.LinkAddressID as varchar) = A.AddressID 
      and cast(C.LinkID as varchar) = A.ID) 
      then Column1 
      else NULL 
      end 

有表A中大約有1.6m的記錄在鏈表中僅有超過4m的記錄。

有沒有更好的方法來編寫這個查詢/視圖,將更加優化?

請讓我知道是否需要

+1

定義varchar數據類型時,應始終指定大小。沒有更多的細節在這裏很難知道發生了什麼,但它似乎可能是一個左連接到LinkTable會更好。在我們真正幫助之前,您需要提供更多信息。查詢的一小部分不足以提升性能。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

請提供實際的執行計劃和查詢 – Devart

+0

另外您的查詢不可SARGABLE,它可能最終會做掃描 – TheGameiswar

回答

0
Select C.LinkID 
    From A 
    Left Join C On C.LinkAddressID = A.AddressID And C.LinkID = A.ID 

此詳細信息,如果在這兩個條件,NULL存在匹配,如果這兩個條件不滿足會給你C.LinkID。

在A.ID上具有諸如主鍵的索引/鍵和基於聯接子句中的內容的外鍵關係將提供非常好的性能。

0

喬建議,如果對所有60列使用相同的AddressId和ID領域相匹配的兩個表,相信這樣你就可以使用的東西,如下面的查詢

SELECT 
    Column1 = CASE WHEN C.LinkID IS NULL THEN NULL ELSE A.Column1 END, 
    .... 
FROM A 
Left Join LinkTable C 
    ON C.LinkAddressID = A.AddressID AND C.LinkID = A.ID 

轉換數據類型肯定會禁用來自索引的優勢。因此,如果可能的話,在連接和WHERE子句中保留數據類型的轉換