[英]Improve performance of SQL query with a FOR XML PATH in SQL Server 2008
我試圖使用For XML路徑為用戶連接LoadIds,這是整個查詢的一部分,我驗證了在計算此串聯的LoadId列時已花費了最大時間。 以下是語法,有人可以建議一種有效地重寫此方法的方法嗎?
SELECT
Col1, col2,
LoadIds = STUFF((SELECT ' , ' + CAST([LoadId] AS varchar(5))
FROM Table1 AS t1
WHERE t1.[UserId] = [t2].[UserId]
FOR XML PATH ('')), 1, 2, '')
FROM
Table1 AS t2
GROUP BY
[UserId]
您可以做的一件事是在進行字符串聚合之前選擇不同的用戶ID:
SELECT t2.UserId,
STUFF((SELECT ' , ' + CAST([LoadId] AS varchar(8000))
FROM Table1 t1
WHERE t1.[UserId] = [t2].[UserId]
FOR xml PATH ('')
), 1, 2, ''
) as LoadIds
FROM (SELECT DISTINCT userId
FROM Table1 t2
) t2;
為了提高性能,對table1(UserId, LoadId)
的索引也將有所幫助。
1)。 我會嘗試在臨時表或表變量中收集所需的數據,在其上創建一個索引,然后再進行隱式處理。
2)。 FOR XML PATH適用於小型記錄集,對於大型記錄集,我會嘗試遞歸。
declare @T table (
UserId int not null,
RowNumber int not null,
LoadId varchar(5) not null
primary key clustered (UserId, RowNumber)
);
insert into @T
select
UserId,
row_number() over(partition by UserId order by LoadId),
CAST(LoadId AS varchar(5))
from
Table1 ;
with cte (UserId, RowNumber, LoadIds) as
(
select
UserId,
RowNumber,
LoadIds = convert(varchar(8000), LoadId)
from @T
where RowNumber = 1
union all
select
t.UserId,
t.RowNumber,
convert(varchar(8000), cte.LoadIds + ', ' + t.LoadId)
from
cte inner join @T t on t.UserId = cte.UserId and t.RowNumber = cte.RowNumber + 1
)
select UserId, LoadIds = max(LoadIds) from cte group by UserId;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.