У меня есть хранимая процедура, которая выбирает данные из списков, окна ввода счетчика и флажок, который он выполняет отлично, но для выполнения этого требуется около 2.30 минут, которые вызывают ошибку в моем заявление.Как сократить время выполнения хранимой процедуры в SQL Server
Ошибка
Время ожидания истекло. Период ожидания истекает до завершения операции или сервер не отвечает.
Тогда как я могу сократить время, затраченное моей хранимой процедурой?
Это код хранимой процедуры:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_SearchCAMAStructure]
@section as nvarchar(max),
@quality as nvarchar(max),
@style as nvarchar(max),
@ward as nvarchar(max),
@improvment as nvarchar(max),
@condition as nvarchar(max)
AS
BEGIN
SET NOCOUNT ON;
Declare @Where as varchar(max)
Declare @Select as varchar(max)
Set @Select = ' Distinct vi.struct_no as structure, a.assesmt_no as assessment, o.own_last+'' , ''+o.own_first as taxpayer, id.year_built as built, id.effect_age as age, vi.aprais_val as mktvalue
From [dbo].assessments a
inner join parcel p on a.parcel_no = p.parcel_no
inner join valueimp vi on vi.assesmt_no = a.assesmt_no
inner join owner o on o.id = a.owner_id
inner join imp_details id on id.improvementId = vi.id and (id.isdeleted is null or id.isdeleted = 0)
inner join quality_details qd on qd.quality_id = id.quality_id
inner join section_details sd on sd.section_id = id.section_id
inner join style_details stdl on stdl.style_id = id.style_id
inner join parcel pw on p.ward_no = pw.ward_no'
Set @Where = ' where sd.section_id =ISNULL(@section,sd.section_id)
AND qd.quality_id = ISNULL(@quality,qd.quality_id)
AND stdl.style_id = ISNULL(@style,stdl.style_id)
AND pw.ward_no = ISNULL(@ward,pw.ward_no)
AND id.improvementId = ISNULL(@improvment,id.improvementId)'
if @condition = 1 --Equal to
Begin
Set @Where = @Where + ' and (' [email protected]+ ' is null or id.effect_age = ' [email protected]+ ')'
end
else
if @condition = 2 --Greater than or Equal
Begin
Set @Where = @Where + 'and (' [email protected]+ ' is null or id.effect_age > ' [email protected]+ ')'
end
else
if @condition = 3 --Less than or equal
Begin
Set @Where = @Where + 'and (' [email protected]+ ' is null or id.effect_age < ' [email protected]+ ')'
end
DECLARE @QUERY NVARCHAR(MAX)
SET @QUERY= 'Select '+ @SELECT + @WHERE
print @QUERY
EXEC sp_executesql @QUERY , N'@section as nvarchar(max) ,@quality as nvarchar(max),@style as nvarchar(max),@ward as nvarchar(max),@improvment as nvarchar(max)',@section ,@quality,@style,@ward,@improvment
END
Если я выполнить хранимую процедуру в следующем, как она занимает много времени, поскольку это исполнение
EXEC usp_SearchCAMAStructure null,null,null,null,null,null
Тогда как уменьшить его?
Почему Oracle тег? – Aleksej
Не использовать Dynamic SQL. Механизм запросов не может кэшировать план выполнения. Преимущество использования этого метода не имеет. – EastOfJupiter
Я бы использовал 3 хранимые процедуры и покончил с динамическим sql. –