2016-10-18 2 views
1

У меня есть хранимая процедура, которая выбирает данные из списков, окна ввода счетчика и флажок, который он выполняет отлично, но для выполнения этого требуется около 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 

Тогда как уменьшить его?

+0

Почему Oracle тег? – Aleksej

+3

Не использовать Dynamic SQL. Механизм запросов не может кэшировать план выполнения. Преимущество использования этого метода не имеет. – EastOfJupiter

+0

Я бы использовал 3 хранимые процедуры и покончил с динамическим sql. –

ответ

0

Попробуйте заменить ненужную ISNULL() функцию из ИНЕК, что может повысить производительность, а также

Set @Where = ' where (@section IS NULL OR sd.section_id = @section) 
AND (@quality IS NULL OR qd.quality_id = @quality) 
AND (@style IS NULL OR stdl.style_id = @style) 
AND (@ward IS NULL OR pw.ward_no @ward) 
AND (@improvment IS NULL OR id.improvementId = @improvment)' 
0

Вы можете попытаться изменить динамический запрос со следующим кодом ..

/****** Object: StoredProcedure [dbo].[usp_SearchCAMAStructure] Script Date: 10/18/2016 3:05:14 PM ******/ 
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 INT 
As 
Begin 

SET NOCOUNT ON; 
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_nowhere 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) 
    AND ((@condition=1 AND [email protected]) OR (@condition=2 AND id.effect_age>@improvment) OR (@condition=2 AND id.effect_age<@improvment) OR @condition IS NULL) 
END 
Смежные вопросы