2012-03-02 3 views
0

引用やポリシーテーブルに存在しない投稿をすべて選択しようとしています。別のテーブルにない場所を選択

select 
COUNT (*) 
from Submission S 
where 
(S.Submission_Status='New' OR S.Submission_Status='Quoted to Agent' OR S.Submission_Status='Cleared') 
and YEAR(S.Submission_Date) >= YEAR(GETDATE()) 
and S.Submission not in (select distinct Submission from Policy where Submission is not null) 
and S.Submission not in (select distinct Submission from Quote where Submission is not null) 

このクエリは、良い結果を返しますが(政策と株価のテーブル内のレコードがたくさんあるので)クエリは非常に遅いです。このクエリーのより速いバージョンを作ることは可能ですか(私はJOINで推測します)?私はこれを試してみましたが、結果は最初のクエリと一致しない

enter image description here

+0

「distinct」を削除するとクエリがどのように加速しますか?あなたはそれを必要としません... –

+0

私はこれらの2行を完全に削除する必要があると思いますので、別名は重要ではないとにかく –

答えて

0
、Submission_StatusとS.Submission_Dateにインデックスを追加

おかげで、
Ilija

EDIT

select 
COUNT (*) 
from Submission S 
where S.Submission_Status IN ('New','Quoted to Agent','Cleared') 
and YEAR(S.Submission_Date) >= YEAR(GETDATE()) 
and S.Submission not in (select distinct Submission from Policy p FULL OUTER JOIN Quote q ON p.Submission=q.Submission where Submission is not null) 
+0

私はそれを試しましたが、結果は私の元のクエリと一致しません:http://i.stack。 imgur.com/Kw7uC.jpg –

0

サブセルを使用する代わりにLEFT OUTHER JOINを使用することがありますect checking if Submission==null

基本的に一致しないレコードを取得する必要があります。このコードはSubmission_Dateにインデックスを許可します

S.Submission_Date >= DateAdd(Year, DateDiff(Year, 0, GETDATE()), 0) 

:へ

YEAR(S.Submission_Date) >= YEAR(GETDATE()) 

このリンクはあなたのクエリをリファクタリングするのを助けることができる

Retrieve non matching record using join

0

変更は、この部分それが存在すれば使用される。これは、元の文と機能的に同等です。

0

not innot existに置き換えようとしましたが、この方法ではdistinctにはなりません。究極のソリューション - 多数のレコードがあるためにパフォーマンスが低下することが確かな場合は、各テーブル(select distinct …)にインデックス付きビューを作成してください。policyおよびquote一部のsqlserverエディションでは、クエリを変更する必要はなく、自動的にビューを使用します。

関連する問題