2016-10-18 106 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

爲什麼甲骨文標籤? – Aleksej

+3

請勿使用動態SQL。查詢引擎無法緩存執行計劃。使用此方法沒有性能優勢。 – EastOfJupiter

+0

我會使用3個子存儲過程,並取消動態SQL。 –

回答

0

試圖取代從where子句不必要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 
相關問題