2014-07-19 242 views
-1

我怀疑下面的查询是瓶颈服务器,但我不确定如何调整查询以使其更高效。如果您有任何建议,请让我知道。我知道case语句对于查询以及使用左连接而不是union可以。所以我认为这个问题必须在where语句的其他陈述中。但正如我所说我不确定。需要很长时间才能执行SQL Server的SQL查询

SELECT 
svc.[Name] AS 'Type', 
os.OrderID, 
os.CustomerID, 
os.Transit, 
os.ApplicantFullName, 
os.OriginalTransit, 
ISNULL(p.UnitNumber , '') + ' ' + ISNULL(p.StreetNumber, '') AS 'Number', ISNULL(st.[Name], 'NULL') AS 'Street', 
c.[Name] AS 'City', 
p.PostalCode, 
os.RequesterRefNo, 
os.MortgagePurpose, 
os.GrossTAT 
os.NetTAT 
os.StopTime 
os.ModifiedGrossTAT, 
os.ReOpenFlag, 
os.MinReOpenDate, 
O.NegotiatedFees, 
O.BranchLogonID, 
CASE 
When os.Transit in ('710','740','745','750','760','770','820','830','850','871','7409','7709') THEN 'Calgary 1' When os.Transit in ('720','730','774','780','783','790','821','834','840','858','881','894') THEN 'Calgary 2' When os.Transit in ('744','763','810','7639')THEN 'Calgary 3' 
When os.Transit in ('736','768','779','826','837','857','876','879','887','898','899')THEN 'North 2' 
When os.Transit in ('716','726','737','738','746','767','778','798','818','838','846','878')THEN 'North 3' When os.Transit in ('180')THEN 'MDO Tr 180 Edmonton' 
When os.Transit in ('460','02099','New','PRIMARY')THEN 'MDO TR 460 Calgary' 
END AS 'ATBRegion1', 
CASE 
When os.Transit in 
When os.Transit in 
When os.Transit in 
When os.Transit in 
When os.Transit in 
When os.Transit in 
('710','740','745','750','760','770','820','830','850','871','7409', ,'858','881','894','744','763','810','7639') THEN 'Calgary' ('728','731','735','751','755','771','775','791','795','824','835','854','855','875','885','748','844','847','888')THEN 'Edmonton' ('722','733','734','742','782','793','812','822','842','853','893')THEN 'South' ('724','753','772','773','832','836','866','867','877','896','712','781','873')THEN 'Central' ('719','729','739','749','759','769','789','799','819','829','737','738','746','767','778','798','818','838','846','878')THEN 'North' ('180','460','02099','New','PRIMARY')THEN 'MDO/Consumer Credit' 
END AS 'ATBRegion2', 
CASE 
WHEN os.CustomerID 
WHEN os.CustomerID 
WHEN os.CustomerID 
WHEN os.CustomerID 
WHEN os.CustomerID 
WHEN os.CustomerID 
WHEN os.CustomerID 
ELSE os.CustomerID 
like '%ATB%' THEN 'ATB' 
like '%PROS%' THEN 'PROSPERA' 
like '%BLC%' THEN 'BLC' 
like 'BW%' THEN 'BWorx' 
like 'CIBC%' THEN 'CIBC' 
like '%PROS%' THEN 'PROSPERA' 
like 'FNF%' THEN 'CIBC' 
END AS CLIENTIDCLEAN, 
CASE 
WHEN os.Cancelled = 
0x1 THEN 'Cancelled' 
     ELSE '' 
END AS 'Cancelled', 
os.AppraiserFirm, 
CASE 
WHEN ai.AppraiserTypeID = 1 THEN 'SS' WHEN ai.AppraiserTypeID = 2 THEN 'SA' WHEN ai.AppraiserTypeID = 3 THEN 'UC' WHEN ai.AppraiserTypeID = 4 THEN 'NC' WHEN ai.AppraiserTypeID = 5 THEN 'UCFF' 
FROM 
END AS 'AppraiserType', 
CASE 
WHEN CHARINDEX(' ',ADE.[ESTIMATED_MARKET_VALUE.1]) = 0 THEN Substring(REPLACE(REPLACE(CAST(ADE.[ESTIMATED_MARKET_VALUE.1] as NVarchar(4000)),',',''),'$',''), 1, CHARINDEX('.', 
REPLACE(REPLACE(CAST(ADE.[ESTIMATED_MARKET_VALUE.1] as NVarchar(4000)),',',''),'$',''), 1)) ELSE 
Substring(REPLACE(REPLACE(CAST(ADE.[ESTIMATED_MARKET_VALUE.1] as NVarchar(4000)),',',''),'$',''), 1, CHARINDEX(' ', REPLACE(REPLACE(CAST(ADE.[ESTIMATED_MARKET_VALUE.1] as NVarchar(4000)),',',''),'$',''), 1)) 
END as 'AppraisedValue', 
REPLACE(REPLACE(CAST(ADE.[ESTIMATED_MARKET_VALUE.1] as NVarchar(4000)),',',''),'$','') as AppValue, REPLACE(REPLACE(CAST([EST_MARKET_VALUE_RANGE_FROM.1] as NVarchar(4000)),',',''),'$','') as AppValueRangeFrom, REPLACE(REPLACE(CAST([EST_MARKET_VALUE_RANGE_TO.1] as NVarchar(4000)),',',''),'$','') as AppValueRangeTo, NULLIF(os.MarketValue,0) AS 'EstimatedMarketValue', 
CASE WHEN UC.Cityid is null THEN 'Rural' ELSE 'Urban' END as Region, 
CASE WHEN SUBSTRING(p.postalcode, 2, 1) = '0' then 'Rural' ELSE 'Urban' END as PostalRural, EL.TTLORIGINVOICEAMOUNT as Price, 
EL.TTLVENDORCOST as Cost, 
os.AppraiserGrossTAT, 
os.AppraiserNetTAT, 
EXID.expid as EXCEPTIONID, 
SD.PROPERTYVALUE as 'CleanAppraisedValue', 
r.FirstName + ' ' + r.LastName AS "Requester Name" 
DataMart.dbo.OrderSummary AS os 
left JOIN 
CAPS.dbo.[order] AS o on os.orderid = o.orderid Left Join 
CAPS.dbo.[Requester] as r on o.RequesterID = r.RequesterID left JOIN 
CAPS.dbo.Service AS svc ON(svc.ServiceID = os.ServiceID) left JOIN 
CAPS.dbo.OrderStatus AS ostat ON(ostat.OrderStatusID = o.OrderStatusID) left JOIN 
CAPS.dbo.Property AS p ON(p.PropertyID = os.PropertyID) left JOIN 
CAPS.dbo.AppraiserInfo AS ai ON (ai.gp_vendorID = os.AppraiserFirm) LEFT JOIN 
CAPS.dbo.Province AS prov ON(prov.ProvinceID = p.ProvinceID) LEFT JOIN 
CAPS.dbo.City AS c ON(c.CityID = p.CityID) LEFT JOIN 
CAPS.dbo.Street AS st ON(st.StreetID = p.StreetID) LEFT JOIN 
Caps.cruser.UrbanCity UC ON C.Cityid = UC.Cityid LEFT JOIN 
fbc.dbo.TGO_EXTENDEDORDERS_LINE EL WITH (NOLOCK) ON O.Orderid = EL.Ordernumber LEFT JOIN 
(select [ORDERNUMBER], MAX(expID) as expid from (SELECT 
[ORDERNUMBER] ,isnull([EXCEPTIONID],0) as expID 
FROM [FBC].[dbo].[TGO_EXTENDEDORDERSERVICES]) dd group by dd.[ORDERNUMBER]) EXID on EXID.ORDERNUMBER = os.orderid 
LEFT JOIN (select ORDERID, max(PROPERTYVALUE) as PROPERTYVALUE from TrendPoint.dbo.SourceData where DATAID = 0 and CLEANDATA_FLAG in (0,1)group by orderID having 
COUNT(*) < 3) SD on SD.ORDERID = os.OrderID 
LEFT JOIN (select * from CAPS.dbo.AppraisalDataExtract where WorkingCopy = 0)ADE on ADE.OrderID = os.OrderID 
WHERE os.CompletionDate >= '2012-01-01' and os.OrderID in (2427915, 2427917,2437863,2437880,2437630) 
+1

能否请您发布说明查询计划,您正在使用的表的索引,您要过滤的列的选择性以及绝对最小值的行数? – Ben

回答

1

你可能想打开执行计划为此查询找到最昂贵的运营商,并从那里开始,如果没有其他进程阻塞此查询。 也许缺少索引和太多连接

0

您可能需要考虑在您的ON语句中使用更多谓词的一个区域。这将使您的查询甚至在执行最终的WHERE过滤器之前消除行,这可能会创建一个允许更好地使用索引的情况。

另一个你可能想要看的领域是像%%经常使用像不允许这样使用索引的时候,如果在字面上没有搜索字符就像'BW%'将使用索引,但像'%BW'不会使用索引。

你最好的选择,虽然是采取看看你的查询执行计划(以及可能提交这里。查询分析器真的将是解决你的问题,你的最佳来源。

相关问题