SQL Where / From子句优化(sql-server)

时间:2016-04-28 19:29:59

标签: sql sql-server performance

我目前正在处理报告查询中的3分47秒执行时间。我真的很想在一分钟之内尝试执行。这个where子句占执行计划的66%。

这个Where子句在遵循执行计划之后是最明确的罪魁祸首。

在Where子句中使用这些类型的数据过滤器是不好的做法吗?如果是这样,我应该尝试将它与FROM子句中的内部联接语句结合起来以加快执行速度吗?

select txtPolicyNum
      ,Sum(CASE WHEN txtDebitCredit='d' THEN txtAmt*-1 ELSE txtAmt END) As Prem
into #prem
from proddw.dbo.miscGLHistory
where Left(txtAccountNum,1)='3'
Group by txtPolicyNum
Order by txtPolicyNum




SELECT 
ad.txtAgentNum GAAgentNum,
AgentNum.txtAgentNum Agent_Num,
rtrim(AgentNum.txtPriFName)+ ' ' + rtrim(AgentNum.txtPriLName) as Agent_Name,

mainDim.txtFHMainNum as MainBranch, 
fd.txtFHNum as FH_Num,
fd.txtPriName as FH_Name,
iv.txtPolNum as PolicyNum, 
rtrim(oi.txtIndFirst)+' '+rtrim(oi.txtIndLast) As Insured_Name,
iv.txtProdType as Product,
Substring(iv.txtPlanCode,4,2)+' ' + Substring(iv.txtPlanCode,6,3) as Plan_At_Issue,
Convert(date,iv.datCycleDate,102) IssueDate, 
CASE WHEN iv.intCount=0 THEN 'Rider'
     WHEN iv.intCount=1 THEN 'NewIss'
     ELSE 'Policy Adjustment' end as Type, 
iv.decPaidPAP+iv.decPaidPAA AS Funeral_Amt,
iv.decProdVal AS Face, 
CASE WHEN Substring(iv.txtPlanCode,6,3) = 'ROP' THEN p.Prem * 1.05
     ELSE iv.decProdVal END as Current_Death_Benefit, 
iv.intIssAge as Age,
rtrim(oe.txtIndFirst)+' '+rtrim(oe.txtIndLast) As Owner_Name


INTO #StepOne
FROM proddw.dbo.IssVal as iv 
inner join proddw.dbo.AgentRef ar on iv.intAgentRefID = ar.intAgentRefID
inner join proddw.dbo.AgentDim AgentNum on ar.intAgentID = AgentNum.intAgentID
--Getting Agent NUM

inner join proddw.dbo.GARef agt on iv.intGARefID = agt.intGARefID
inner join proddw.dbo.AgentDim ad on agt.intAgentID=ad.intAgentID
--Getting GA NUM
--These Fields Are Populating Correctly

--Getting FH Num
inner join proddw.dbo.FHRef fr on iv.intFHRefID=fr.intFHRefID
inner join proddw.dbo.FHDim fd on fr.txtFHNum=fd.txtFHNum
--Getting FHMainNum
inner join proddw.dbo.FHMainRef rm on iv.intFHMainRefID=rm.intFHMainRefID
inner join proddw.dbo.FHDim mainDim on rm.txtFHMainNum=mainDim.txtFHMainNum
--Getting InsuredName
inner join proddw.dbo.InsRef ir on iv.intInsRefID=ir.intInsRefID
inner join proddw.dbo.OwnInsBeneDim oi on ir.intID=oi.intID
--Getting PolOwnerName
inner join proddw.dbo.OwnRef orw on iv.intPolOwnerRefID = orw.intOwnRefID
inner join proddw.dbo.OwnInsBeneDim oe on orw.intID = oe.intID

   inner JOIN #Prem p on iv.txtPolNum=p.txtPolicyNum
WHERE 
 ad.txtAgentNum='2K884' -- AND r.txtRelateCode='in' 
 AND iv.intBenSeq > 0
 and iv.txtBenType in ('BA', 'BF', 'OR')
 AND (fr.datStartDate <= iv.datCycleDate AND fr.datStopDate >= iv.datCycleDate)
 AND (rm.datStartDate <= iv.datCycleDate AND rm.datStopDate >= iv.datCycleDate)
 AND (agt.datStartDate <= iv.datCycleDate AND agt.datStopDate >=iv.datCycleDate)
 AND (ar.datStartDate <= iv.datCycleDate AND ar.datStopDate >= iv.datCycleDate)
AND (ir.datStartDate <= iv.datCycleDate AND ir.datStopDate >= iv.datCycleDate)
AND (orw.datStartDate <= iv.datCycleDate AND orw.datStopDate >= iv.datCycleDate)

GROUP BY
ad.txtAgentNum,
AgentNum.txtAgentNum,
rtrim(AgentNum.txtPriFName)+ ' ' + rtrim(AgentNum.txtPriLName),

mainDim.txtFHMainNum, 
fd.txtFHNum,
fd.txtPriName ,

iv.txtPolNum, 
rtrim(oi.txtIndFirst)+' '+rtrim(oi.txtIndLast), 
iv.txtProdType, 
Substring(iv.txtPlanCode,4,2)+' ' + Substring(iv.txtPlanCode,6,3),
rtrim(oe.txtIndFirst)+' '+rtrim(oe.txtIndLast),
iv.datCycleDate,
CASE WHEN iv.intCount=0 THEN 'SP Rider'
     WHEN iv.intCount=1 THEN 'New Issue'
     ELSE 'Policy Adjustment' end, 
iv.intCount, 
iv.intIssAge,
iv.decProdVal,
iv.decPaidPAP+iv.decPaidPAA,
CASE WHEN Substring(iv.txtPlanCode,6,3) = 'ROP' THEN p.Prem * 1.05
     ELSE iv.decProdVal END



Select s.*
from #StepOne s
order by s.PolicyNum



enter code here

0 个答案:

没有答案