SQL Server OPENJSON работает плохо - PullRequest
0 голосов
/ 09 апреля 2019

Я работаю с плохо работающим запросом, который работает с большим набором данных со многими миллионами записей. Параметры передаются в хранимую процедуру как JSON и извлекаются в процедуре.

Когда данные JSON назначаются с помощью OPENJSON в общем табличном выражении, запрос занимает 74 секунды :

create procedure [getResults] ( @Input nvarchar(max) = '' ) as
declare @MaxResults int = json_value(@Input, '$.MaxResults');

with SearchInfo (FirstName, MiddleName, LastName) as (
    select FirstName, MiddleName, LastName
    from openjson(@Input)
    with ( FirstName nvarchar(50) '$.FirstName', MiddleName nvarchar(50) '$.MiddleName', LastName nvarchar(50) '$.LastName' )
)
select top (@RowCount) * from SearchInfo cross apply getMatches(FirstName, MiddleName, LastName)

Если я переместлю OPENJSON за пределы общего табличного выражения, запрос займет всего 18 секунд :

create procedure [getResults] ( @Input nvarchar(max) = '' ) as
declare @MaxResults int = json_value(@Input, '$.MaxResults');
declare @FirstName nvarchar(50), @MiddleName nvarchar(50), @LastName nvarchar(50);

select @FirstName = FirstName, @MiddleName = MiddleName, @LastName = LastName
from openjson(@Input)
with ( FirstName = '$.FirstName', MiddleName = '$.MiddleName', LastName = '$.LastName' );

with SearchInfo (FirstName, MiddleName, LastName) as (
    select FirstName, MiddleName, LastName
    from (values (@FirstName, @MiddleName, @LastName))
)
select top (@RowCount) * from SearchInfo cross apply getMatches(@FirstName, @MiddleName, @LastName)

Если я полностью отказываюсь от OPENJSON и использую только JSON_VALUE, запрос занимает всего 4 секунды :

create procedure [getResults] ( @Input nvarchar(max) = '' ) as
declare @MaxResults int = json_value(@Input, '$.MaxResults');
declare @FirstName nvarchar(50) = json_value(@Input, '$.FirstName');
declare @MiddleName nvarchar(1) = json_value(@Input, '$.MiddleName');
declare @LastName nvarchar(50) = json_value(@Input, '$.LastName');

with SearchInfo (FirstName, MiddleName, LastName) as (
    select FirstName, MiddleName, LastName
    from (values (@FirstName, @MiddleName , @LastName))
)
select top (@RowCount) * from SearchInfo cross apply getMatches(@FirstName, @MiddleName, @LastName)

И, наконец, если я полностью удаляю вызовы JSON, запрос занимает всего 1 секунду :

create procedure [getResults] ( @Input nvarchar(max) = '' ) as
declare @MaxResults int = json_value(@Input, '$.MaxResults');
declare @FirstName nvarchar(50) = 'Chris';
declare @MiddleName nvarchar(1) = 'H';
declare @LastName nvarchar(50) = 'Schiffhauer';

select @FirstName = FirstName, @MiddleName = MiddleName, @LastName = LastName
from openjson(@Input)
with ( FirstName = '$.FirstName', MiddleName = '$.MiddleName', LastName = '$.LastName' );

with SearchInfo (FirstName, MiddleName, LastName) as (
    select FirstName, MiddleName, LastName
    from (values (@FirstName, @MiddleName, @LastName))
)
select top (@RowCount) * from SearchInfo cross apply getMatches(@FirstName, @MiddleName, @LastName)

Какой самый быстрый способ извлечения данных JSON в хранимых процедурах SQL Server, чтобы избежать ненужных задержек?

...