Почему размер varchar влияет на производительность запросов? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть запрос, который генерирует строку 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 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...