Я работаю с плохо работающим запросом, который работает с большим набором данных со многими миллионами записей. Параметры передаются в хранимую процедуру как 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, чтобы избежать ненужных задержек?