我有一个查询需要针对遗留数据库中不正确关系的表运行(因为它是软件公司的想法),并且没有主键等。
我遇到的问题是需要从多个表中返回特定数据,但这些表的大小非常大,查询可以根据用户需求进行更改。
从应用程序调用此查询并返回数据集以供.NET应用程序使用。
查询
SELECT pro.Name , pro.Pcode , pro.Addr1 , pol.B@ , pol.PolRef@ , ec.Aggregator ,
CASE WHEN ec.Notes1 = 'Click Purchase' THEN 'BOL' WHEN ec.Notes1 = 'Click' THEN 'Click' ELSE 'TopX' END 'Type' ,
pol.Create_date 'Date' , REVERSE(STUFF(REVERSE(pol.Create_time), 3, 0, ':')) 'Time' ,
pol.Premium,
ben.[Delphi ID Score],
ben.[Delphi Score 1 - 90CON]
FROM dbo.ic_Daprospect pro
INNER JOIN dbo.ic_Dapolicy pol ON pol.B@ = pro.B@ AND pol.Ref@ = pro.Ref@
INNER JOIN dbo.ic_DP_EC ec ON ec.B@ = pol.B@ AND ec.PolRef@ = pol.PolRef@
LEFT OUTER JOIN dbo.v_FIG_BEN ben ON ben.B@ = pol.B@ AND ben.PolRef@ = pol.PolRef@
WHERE dbo.RemoveSpaces(pro.Pcode) = '" & sPostcode.Replace(" ", "") & "'
AND SUBSTRING(pol.Ref@, 1, 4) <> 'POMS'
AND pol.B@ IN (" & sBranch & ")
AND pol.Create_date >= dbo.Today() - " & sDayRange & ""
由于邮政编码可以输入两个空格,或者没有我有一个删除WHERE语句空格的函数,并且随后依赖于它们在应用程序中键入的内容,也会删除空格。
'sBranch'变量只是一个0或1或3或0,1,3的varchar。
创建日期基本上是dbo.Today,它在今天的日期没有当前时间,然后只使用减去x天数,他们从应用程序中的天数中选择。
问题
查找本身用于客户端需要速度的环境中(如果可以,它应该总是很快)。它可能需要15秒到40秒的时间,这是FAR太长了。
由于此数据库的设置,B @和PolRef @上只存在唯一的索引,为了加快此查询,我最好将INDEX应用于我在'Postcode','Ref @'上搜索的4列, 'B @','Create_Date'?
我知道这是一个非常开放的问题,但只需要一些指导,如果需要进行更多的查询优化,请告诉我。