2011-06-20 198 views
2

我對SQL查詢不太熟悉,但注意到使用Select Distinct運行查詢時性能顯着下降。我正在運行SQL Server 2008 R2。下面是我的查詢:SELECT DISTINCT的替代方案

select distinct CL.ClientID, NL.Name 
from CL CL 
inner join PR PR on CL.ClientID = PR.ClientID 
where PR.WBT1 in (Select distinct WBT1 
        from TabFields 
        where custInclude = 'Y' and WBT2 = '') 
and PR.WBT2 = '' 
order by NL.Name 

有誰知道如何在不爲了在返回相同的結果,以加快查詢中使用SELECT DISTINCT修改此查詢?任何幫助是極大的讚賞。謝謝。

+1

當你說「一個顯著性能降低」,你可以提供任何號碼? (你如何衡量?你在查看查詢計劃,查詢執行統計數據,所花的時間?)你的查詢有什麼區別?第一個select子句中只有「distinct」關鍵字?或者也在「IN」子查詢中? – Tao

+1

當你使用'IN'時,你不需要''''' – Magnus

回答

5

你絕對不需要第二個SELECT DISTINCT。您可以通過EXIST替換:

select distinct CL.ClientID, NL.Name from CL CL 
inner join PR PR on CL.ClientID = PR.ClientID 
WHERE EXISTS 
(SELECT 1 from TabFields where WBT1=PR.WBS1 AND custInclude = 'Y' and WBT2 = '') 
and PR.WBT2 = '' order by NL.Name 

而且我沒有看到NLFROM /JOIN。你錯過了嗎?或者它應該是CL

+0

感謝您的輸入! –

6

由於JOIN,您只需要DISTINCT。

所以不要使用JOIN:使用EXISTS和推你沒有真正從進入EXISTS子句選擇所有表

select CL.ClientID, CL.Name 
from CL CL 
WHERE EXISTS (SELECT * 
    FROM 
     PR PR 
     JOIN 
     TabFields TF ON PR.WBT1 = TF.WBT1 
    WHERE 
     PR.WBT2 = '' AND 
     TF.custInclude = 'Y' and TF.WBT2 = '' AND 
     CL.ClientID = PR.ClientID 
    ) 
order by CL.Name 
+0

謝謝!我很感謝幫助。 –