2011-06-20 20 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 

は同じ結果を戻しながら、クエリをスピードアップするために、明確な選択使用せずに、このクエリを修正する方法を誰もが知っていますか?どんな助けでも大歓迎です。ありがとう。

+1

あなたがいずれかを提供することができ、「大幅なパフォーマンスの低下」と言います数字? (どのように測定していますか?クエリプラン、クエリ実行の統計、時間などを調べていますか?)クエリの違いは何ですか?最初のselect句の "distinct"キーワードだけですか?または "IN"サブクエリにもありますか? – Tao

+1

'IN'で使用するときは' distinct'は必要ありません – Magnus

答えて

5

2番目の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 

そして私はFROM /JOINNLが表示されません。あなたはそれを見逃しましたか、それともCLであるはずですか?

+0

入力してくれてありがとう! –

6

JOINのためにDISTINCTが必要です。

ので、JOINを使用しないでください:使用が存在し、あなたが実際に句を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

ありがとう!私は援助に感謝します。 –