2014-07-19 240 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'不會使用索引。

你最好的選擇,雖然是採取看看你的查詢執行計劃(以及可能提交這裏。查詢分析器真的將是解決你的問題,你的最佳來源。

相關問題