我正在改進使用FOR XML PATH('')函數使用20列的視圖性能。該視圖還調用其他字段使用非聚集視圖CTE,子查詢和CAST函數,但我現在不關心它們。FOR XML PATH性能改進挑戰
該視圖是一個非聚集視圖,每5分鐘由作業選擇該視圖以將新數據顯示給客戶端應用程序。因此底層源表格正在更新並每隔5分鐘插入一個井。
我已經在適當的地方創建了羣集和非羣集索引。在創建相應索引之前對源表上的各個視圖組件進行了測試,之後選擇了最佳路由。所以,我在索引方面做得很好。在所有指標上,填充因子值幾乎爲100。
我的假設是,查詢速度放緩了很多,因爲我使用的針對20列XML PATH(「」)......
CREATE VIEW MyView
AS
col1,
Col2,
(SELECT CAST(Mytbl.[EmpId] AS NVARCHAR(50)) + '|' FROM MyDB.dbo.Mytbl_Optimized AS t1 (NOLOCK)
LEFT OUTER JOIN AnotherDB.dbo.Another-tbl AS t2 WITH (NOLOCK)
ON t1.EmpId = t2.EmpId
WHERE AnotherDB.dbo.Table3.MyId = t1.MyId
FOR XML PATH('')) AS MyConcatenatedID
FROM AnotherDB.dbo.Table3
我試圖用它確定一個CASE語句如果每個列都帶有FOR XML PATH('')任何要逐行連接的基礎,然後僅當is有2個或更多個值連接到一個字符串時才使用FOR XML PATH('')。但正如我所期望的性能是可怕的......
,CASE
WHEN
(SELECT
LEN(EmpId) - LEN(REPLACE(EmpId, '|', '')) AS [CountOfConcatinated_EmpId]
FROM ISSearch..SearchBid WITH (NOLOCK)
) > 1 -- this determis if values are concatenated or not.
THEN
(SELECT CAST(Mytbl.[EmpId] AS NVARCHAR(50)) + '|' FROM MyDB.dbo.Mytbl_Optimized AS t1 (NOLOCK)
LEFT OUTER JOIN AnotherDB.dbo.Another-tbl AS t2 WITH (NOLOCK)
ON t1.EmpId = t2.EmpId
WHERE AnotherDB.dbo.Table3.MyId = t1.MyId
FOR XML PATH(''))
ELSE
(SELECT CAST(Mytbl.[EmpId] AS NVARCHAR(50)) + '|' FROM MyDB.dbo.Mytbl_Optimized AS t1 (NOLOCK)
LEFT OUTER JOIN AnotherDB.dbo.Another-tbl AS t2 WITH (NOLOCK)
ON t1.EmpId = t2.EmpId
WHERE AnotherDB.dbo.Table3.MyId = t1.MyId)
END AS EmpId
FROM AnotherDB.dbo.MyView;
現在我考慮已經由FOR XML PATH(「」)的所有20列,在視圖單獨的列的函數字符串連接在一起的緩存選項,但需要不斷更新(每5分鐘)。
任何想法或替代解決方案?
我假設'AnotherDB.dbo.Another-tbl作爲t2'是一個虛擬名稱,但那些需要離開連接(或在那裏)?至少在提供的查詢中,他們似乎沒有做任何事情。我想知道一些其他的事情:1)有多少行被連接到'MyConcatednatedId'的每個值中2)在'Table3'中有多少行3)它現在的表現有多慢4)你有多快需要它? – Xedni
使用[粘貼計劃@ brentozar.com](https://www.brentozar.com/pastetheplan/)分享您的執行計劃以下是說明:[如何使用粘貼計劃](https://www.brentozar的.com/pastetheplan /指令/)。 – SqlZim