我正在尝试选择Quote或Policy表中不存在的所有提交。
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)
此查询返回了良好的结果,但查询速度极慢(因为Policy和Quote表中有很多记录)。是否有可能制作更快版本的查询(我想用JOIN)?
谢谢,
伊利亚·
编辑:
我试过这个,但结果与第一个查询不匹配:
答案 0 :(得分:0)
在Submission_Status和S.Submission_Date,Submission
上添加索引答案 1 :(得分:0)
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)
答案 2 :(得分:0)
您可以使用LEFT OUTHER JOIN
代替使用子选择检查Submission==null
基本上你需要得到不匹配的记录。
此链接可帮助您重构查询
答案 3 :(得分:0)
更改此部分:
YEAR(S.Submission_Date) >= YEAR( GETDATE())
要:
S.Submission_Date >= DateAdd(Year, DateDiff(Year, 0, GETDATE()), 0)
此代码将允许使用Submission_Date上的索引(如果存在)。它在功能上也与原始陈述相同。
答案 4 :(得分:0)
我尝试用not in
替换not exist
,这样你就不会distinct
。终极解决方案 - 如果您确定由于policy
和quote
中的大量记录而导致性能下降,请在每个表(select distinct …
)上创建索引视图。在某些sqlserver版本中,您甚至不必更改查询,它将自动使用视图