簡體   English   中英

使用SQL Server 2008中的FOR XML PATH提高SQL查詢的性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM