0

我們在SQL Server 2008 R2中查詢性能方面存在問題。查詢連接來自2個數據庫的表格,其中一個是我們的數據集市從iSeries系統獲取數據,另一個是我們的主要報告系統。通過加入殺死SQL查詢的性能

在下面的查詢中,我們應該在30秒內得到90939條記錄。如果我們刪除PO.POwner列,結果會在大約10秒後回來。

但是,當我們添加po.POwner列時,它正在殺死它。

SELECT cu.* ,C4.C4IND, cu.CUS_Citizenship as [Country of Incorporation], 
    cu.CUS_Nationality as [Residence Country],[FirstParticipantID]=ISNULL(po.POwner,cu.CUS_No) 
    -- , cu.CUS_No COLLATE Latin1_General_CS_AS, po.POwner COLLATE Latin1_General_CS_AS 
    FROM dbo.CustomerData cu 
    left outer join Hermes_Import.dbo.KFILDTO_C4PF C4 
     on cu.CUS_Type COLLATE Latin1_General_CS_AS =C4.C4CTP COLLATE Latin1_General_CS_AS 
    OUTER APPLY (
     SELECT TOP 1 
      CASE WHEN GFCTP = 'GG' AND LEN(Y41SCV) > 5 THEN Y41SCV ELSE Y41CUS END AS 'POwner', 
      GFCTP 
     FROM Hermes_Import.dbo.KFILDTO_Y41PF 
      INNER JOIN Hermes_Import.dbo.KFILDTO_GFPF ON GFCUS = Y41CUS 
     WHERE Y41TYP IN ('BN', 'BB', 'CO') AND Y41DEL = 0 AND Y41DEC = 0 
      AND Y41CUS COLLATE Latin1_General_CS_AS = cu.CUS_No COLLATE Latin1_General_CS_AS 
     ) po 
    WHERE Left(Cu.[Cus_No],1)< '8' AND (cu.[CUS_Type])<>'ZA' AND DataDate='2014-04-30' ORDER BY CUS_No 

以下是一個執行計劃(就是上面的3000條記錄): enter image description here

當我們拿出的主要所有者列中,我們得到的所有結果在大約11秒,這裏是執行計劃: enter image description here

我們能做些什麼不同,以獲得主要所有者,銘記我們要達到6個可能participanst的在客戶的第一條記錄佔

回答

1

當你註釋掉po字段時,你不會得到糟糕的性能的原因是OUTER APPLY/TOP 1無論如何都保證只產生一條記錄。

如果你不關心這個記錄的內容,SQL Server也可以優化它的全部條款。

創建以下指標:

Hermes_Import.dbo.KFILDTO_Y41PF (Y41CUS, Y41DEL, Y41DEC, Y41TYP) 
Hermes_Import.dbo.KFILDTO_GFPF (GFCUS) 

而且你在你的OUTER APPLY使用TOP 1沒有ORDER BY。你確定你不關心你選擇了哪個唱片嗎?

+0

您好,感謝尋找,但我們不能創建這些表的索引,因爲這將有隔夜刷新過程的影響納入Hermes_Import - 我們銘記的影響索引表可能對其他功能可能被使用表 –

+0

也,是的,你說得對,我們將在'OUTER APPLY'子句中添加'ORDER BY'後,我們發現我們的問題 - 我們正朝着把參考的一個子集的表到我們的報告系統,因爲我們扶着只能每月運行一次以生成BASEL報告文件。 –

+0

@Philip:你究竟擔心桌子會受到什麼影響?他們那麼大,寫得很重嗎?如果沒有索引,您在該查詢中將無法獲得體面的表現。 – Quassnoi