データの行をループし、テキストをそれぞれSampleUserNumberの1行に連結するCTEクエリを作成しようとしています。
以下は私が取り組んでいるものです:
CREATE TABLE #SampleTable
(
SampleRowID INT IDENTITY(1,1),
SampleUserNumber INT,
SampleLineNumber INT,
SampleTextLine VARCHAR(1000)
)
これが私のCTEクエリです:
これが出力です:
CTEクエリは機能し、結果は正しいですが、私の主な問題は、パフォーマンスと処理する必要があるレコードの量です。現在、最低でも10万件のレコードを扱っています。
質問:
100,000レコードを処理するようにクエリを誤って記述しましたか? CTEを書くためのより効率的な方法はありますか?
これを行うためのより効率的でより良い方法はありますか? [他に方法がない限り、ループは問題外です]
すべての画像でごめんなさい。ここに書き出すより、すべてを表示する方がはるかに簡単だと思いました。
ありがとうございました。
このアプローチは比較してどのように機能しますか?
SELECT
SampleUserNumber,
CombinedMessage = STUFF(
(SELECT N' ' + SampleTextLine FROM #SampleTable
WHERE SampleUserNumber = t.SampleUserNumber
ORDER BY SampleLineNumber
FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)'),1,1,'')
FROM #SampleTable AS t
GROUP BY SampleUserNumber
ORDER BY SampleUserNumber;
#tempテーブルがSampleUserNumber, SampleLineNumber
にクラスター化インデックスを持っているか、少なくともINCLUDE
s SampleTextLine
の2つの列にクラスター化されていないインデックスがあると便利でしょう。
SQL Server 2017では、はるかに簡単なアプローチを使用でき、ほぼ高速であることが保証されています。
SELECT SampleUserNumber,
CombinedMessage = STRING_AGG(CONVERT(varchar(max),SampleTextLine), ' ')
WITHIN GROUP (ORDER BY SampleLineNumber)
FROM #SampleTable
GROUP BY SampleUserNumber
ORDER BY SampleUserNumber;
CONVERT
を回避するには、#tempテーブル列をMAX
タイプにするだけです。