2012-06-08 136 views
-1

我在執行以下查詢:SQL Server 2008-慢性能查詢

需要5分鐘才能返回約68000條記錄。但是,如果我從查詢中刪除LKP_PrivateSource(即最後一個左連接),則需要1秒才能返回68000條記錄。 BTY,LKP_PrivateSource表中沒有記錄。任何想法是什麼導致這個問題?

Select 
Case IsNull(LNK.StockID,0) 
    When 0 Then AE.StockID 
    Else LNK.StockID 
End StockID, 
IsNull(AE.LinkID,0) LinkID,IsNull(LNK.CapitalID,0) CapitalID,DE.SourceName 
,AE.SourceDate 'Date' 
,IsNull(AE.Formula,'') Formula 
From AE_RevenuData AE 
Left Join Linking LNK With(NoLock) ON LNK.LinkID=AE.LinkID 
Inner Join DE_DataEntities DE ON DE.EntityID=AE.EntityID 
Inner Join DataEntityIDs TE ON TE.EntityID=DE.EntityID 
Inner Join STG_LockedEntityData STG ON STG.StockID=IsNull(LNK.StockID,AE.StockID) AND STG.CapitalID=IsNull(LNK.CapitalID,0) 
Left Join LKP_PrivateSource PS ON IsNull(PS.PSourceId,0)=IsNull(AE.PSourceID,0) 
Where AE.ProjectID IN (13) 
AND AE.LinkID IS NOT NULL 

請參閱下面的計劃:

|--Compute Scalar(DEFINE:([Expr1017]=CASE WHEN [Expr1026]=(0) THEN [MYDBNAME].[dbo].[AE_RevenueData].[StockID] as [AE].[StockID] ELSE [MYDBNAME].[dbo].[INV_InvestorFundLinking].[StockID] as [LNK].[StockID] END)) 
    |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Expr1027])) 
     |--Filter(WHERE:([MYDBNAME].[dbo].[STG_LockedEntityData].[StockID] as [STG].[StockID]=isnull([MYDBNAME].[dbo].[INV_InvestorFundLinking].[StockID] as [LNK].[StockID],[MYDBNAME].[dbo].[AE_RevenueData].[StockID] as [AE].[StockID]) AND [MYDBNAME].[dbo].[STG_LockedEntityData].[CapitalID] as [STG].[CapitalID]=[Expr1019])) 
     | |--Compute Scalar(DEFINE:([Expr1019]=isnull([MYDBNAME].[dbo].[INV_InvestorFundLinking].[CapitalID] as [LNK].[CapitalID],(0)), [Expr1026]=isnull([MYDBNAME].[dbo].[INV_InvestorFundLinking].[StockID] as [LNK].[StockID],(0)))) 
     |   |--Nested Loops(Left Outer Join, OUTER REFERENCES:([AE].[LinkID])) 
     |    |--Nested Loops(Inner Join, WHERE:([MYDBNAME].[dbo].[AE_RevenueData].[LinkID] as [AE].[LinkID]=[MYDBNAME].[dbo].[STG_LockedEntityData].[LinkID] as [STG].[LinkID])) 
     |    | |--Sort(ORDER BY:([Expr1027] ASC)) 
     |    | | |--Hash Match(Inner Join, HASH:([TE].[EntityID])=([AE].[EntityID])) 
     |    | |   |--Nested Loops(Inner Join, OUTER REFERENCES:([Uniq1008], [DE].[ListingID])) 
     |    | |   | |--Nested Loops(Inner Join, OUTER REFERENCES:([TE].[EntityID])) 
     |    | |   | | |--Table Scan(OBJECT:([MYDBNAME].[dbo].[DataEntityIDs] AS [TE])) 
     |    | |   | | |--Index Seek(OBJECT:([MYDBNAME].[dbo].[DE_DataEntities].[PK_DE_DataSources] AS [DE]), SEEK:([DE].[EntityID]=[MYDBNAME].[dbo].[DataEntityIDs].[EntityID] as [TE].[EntityID]) ORDERED FORWARD) 
     |    | |   | |--Clustered Index Seek(OBJECT:([MYDBNAME].[dbo].[DE_DataEntities].[IX_DE_DataSources] AS [DE]), SEEK:([DE].[ListingID]=[MYDBNAME].[dbo].[DE_DataEntities].[ListingID] as [DE].[ListingID] AND [Uniq1008]=[Uniq1008]) LOOKUP ORDERED FORWARD) 
     |    | |   |--Compute Scalar(DEFINE:([Expr1018]=[MYDBNAME].[dbo].[AE_RevenueData].[LinkID] as [AE].[LinkID], [Expr1020]=isnull([MYDBNAME].[dbo].[AE_RevenueData].[Formula] as [AE].[Formula],''), [Expr1021]=CONVERT(bit,[MYDBNAME].[dbo].[AE_RevenueData].[IsSumOfFunds] as [AE].[IsSumOfFunds],0), [Expr1022]=isnull([MYDBNAME].[dbo].[AE_RevenueData].[ClientSpecificSource] as [AE].[ClientSpecificSource],N''), [Expr1023]=isnull([MYDBNAME].[dbo].[AE_RevenueData].[GenericSource] as [AE].[GenericSource],N''), [Expr1027]=isnull([MYDBNAME].[dbo].[AE_RevenueData].[PSourceID] as [AE].[PSourceID],(0)))) 
     |    | |    |--Clustered Index Seek(OBJECT:([MYDBNAME].[dbo].[AE_RevenueData].[IX_AE_RevenueData] AS [AE]), SEEK:([AE].[ProjectID]=(13)), WHERE:([MYDBNAME].[dbo].[AE_RevenueData].[LinkID] as [AE].[LinkID] IS NOT NULL) ORDERED FORWARD) 
     |    | |--Table Scan(OBJECT:([MYDBNAME].[dbo].[STG_LockedEntityData] AS [STG])) 
     |    |--Index Seek(OBJECT:([MYDBNAME].[dbo].[INV_InvestorFundLinking].[PK_Linking_1] AS [LNK]), SEEK:([LNK].[LinkID]=[MYDBNAME].[dbo].[AE_RevenueData].[LinkID] as [AE].[LinkID]) ORDERED FORWARD) 
     |--Clustered Index Seek(OBJECT:([MYDBNAME].[dbo].[LKP_PrivateSource].[PK_LKP_FactsetSource] AS [PS]), SEEK:([PS].[PSourceID]=[Expr1027]) ORDERED FORWARD) 
+1

顯示你的計劃。 SSMS,查詢,顯示預計執行計劃。 –

+0

使用'EXPLAIN'並嘗試檢查它失敗的位置。 –

+2

@aF .:在SQL Server中沒有EXPLAIN – Quassnoi

回答

0

我認爲這是事實,你正在使用在左邊的兩側對比功能的加入。

如何解決它真的取決於業務邏輯,但我會考慮可能在該表上做兩個或多個左連接。

一個用於值比較的直接值,另一個用於處理空值邏輯。

您需要將它們添加到您的聚結中,以便它們符合要求。

+0

這不是因爲IsNull,我試圖刪除它。但輸出保持不變。 – user899055