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

왜 오라클 성능을 향상시킬 수 where 절에서 불필요한 ISNULL() 기능을 대체하는 꼬리표? – Aleksej

+3

동적 SQL을 사용하지 마십시오. 쿼리 엔진은 실행 계획을 캐시 할 수 없습니다. 이 방법을 사용하면 성능상의 이점이 없습니다. – EastOfJupiter

+0

나는 3 개의 하위 저장 프로 시저를 사용하고 동적 SQL을 사용하지 않을 것이다. –

답변

0

봅니다 ..뿐만 아니라

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 
관련 문제