У меня есть запрос, который генерирует строку JSON. Это выглядит примерно так, где @Names
равно varchar(max)
:
DECLARE @Names VARCHAR(MAX)
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
create table #temp
(
col1 varchar(100),
col2 varchar(100),
col3 varchar(100),
col4 varchar(100),
col5 varchar(100)
)
declare @count int = 1
WHILE @count <= 600
BEGIN
insert into #temp select 'stuff', 'more stuff', 'even more stuff', 'not enough stuff', 'just the right stuff'
select @count = @count + 1
END
;with cte as
(
select Col1, Col2,col3, col4, col5 from #temp
)
select @Names = COALESCE(@Names + ', ', '') + '{"type": "Feature", ' +
'"properties": {' +
'"Name": "' + cte.Col1 + '",' +
'"Category": "' + cte.Col2 + '",' +
'"UserId": "' + cte.col3 + '",' +
'"Other": "' + cte.col4 + '",' +
'"lat": ' + cte.col5 + ',' +
'"long": ' + cte.col5 + ',' +
'"MyDate": "' + cte.col5 + '",' +
'"Icon": "' + 'icons/MyIcon.svg' + '"' +
'}' +
',"geometry": {"type": "Point","coordinates": [' + cte.col1 + ', ' + cte.col1 + ']}}'
from cte
declare @header varchar(500)
select @header =
'{ ' +
'"type": "FeatureCollection", ' +
'"features": [ '
declare @footer varchar(100) = '] ' +
'} '
select @header + @Names + @footer as 'json'
Выполнение полного запроса занимает около 15 секунд, в то время как запрос в пределах cte
занимает менее одной секунды. Проблема заключалась в построении строки за пределами cte
.
. В итоге я изменил @Names
на varchar(5000)
, и производительность значительно улучшилась с 11 секунд до менее секунды. * Почему это изменение размера в @Names
привело бы к такому улучшению в запросе? Запрос cte
возвращает 600 строк.