저장된 절차가 몇 초 안에 결과를 기준으로 할 때 SSR이 시간을보고하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/237069

문제

저장된 절차에서 데이터를 반환 한 보고서가 있습니다. Profiler를 사용하여보고 서비스에서 저장된 절차에 대한 호출을 포착 할 수 있습니다.

보고서는 보고서가 시간을 초과 한 것으로 밝혀졌지만 SSMS에서 저장된 절차를 실행할 수 있으며 5 초에서 6 초 안에 데이터를 다시 반환합니다.

예제 테스트에서 테스트 실행은 저장된 절차 내에서 보고서 서비스로 전달 된 결과를 다시 수집하기 위해 수천 또는 수백만의 레코드가 작동했을 수 있지만 렌더링을 위해 보고서로 두 개의 행만 반환됩니다.

저장된 절차가 더 많이 최적화 될 수 있다는 것을 알고 있지만 실행이 SSM에서 실행하는 데 몇 초만 걸릴 때 SSRS가 타이밍을하는 이유를 이해하지 못합니다.

또한 또 다른 문제가 나타났습니다. 저장된 절차를 재현하면 보고서가 다시 완벽하게 렌더링되기 시작합니다. 짧은 기간이 지나면 보고서가 다시 시작되기 시작합니다.

Time Out의 반환은 보고서가 실행중인 메인 테이블에 새로운 데이터가 추가되는 것과 관련이있는 것 같습니다. 내가 테스트하고있는 예에서, 100 개의 새로운 레코드 만 삽입 한 것으로 보고서를 망칠 수있었습니다.

나는 근본 원인 인 보고서가 더 정확하다고 생각합니다. SSR에서 실행될 때 시간을 초래하는 것은 저장된 절차입니다.

일단 다시 시간이 다가 오면 지금까지 내가 가진 최선의 수정은 저장된 절차를 재현하는 것입니다. 이것은 이상적인 솔루션이 아닌 것 같습니다.

문제는 또한 생산 환경에서만 발생하는 것 같습니다. 우리의 시험 및 개발 플랫폼은 동일한 문제를 나타내지 않는 것 같습니다. Dev와 Test는 생산과 동일한 양의 레코드를 가지고 있지 않지만.

도움이 되었습니까?

해결책

설명했듯이 문제는 저장된 절차의 일부 부품의 실행 계획에 대한 변형에서 비롯된 것 같습니다. 사용 된 테이블에 보관 된 통계와 새 행을 추가하는 것이 어떤 영향을 미치는지 살펴보십시오.

열 범위의 끝에 많은 행을 추가하는 경우 (자가 주민 또는 타임 스탬프를 추가하는 것에 대해 생각하십시오) 해당 열의 히스토그램은 빠르게 구식이됩니다. 업데이트 통계 문을 실행하여 T-SQL의 즉각적인 업데이트를 강제 할 수 있습니다.

다른 팁

또한 스프로가 실행하는 데 몇 초가 걸리지 만 SSRS는 단순히 시간을 보내는이 문제를 겪었습니다.

나는 내 자신의 경험 에서이 문제를 극복하기위한 몇 가지 다른 방법이 있음을 발견했습니다.

  1. 매개 변수 스니핑입니다! 저장 프로 시저가 SSR에서 실행되면 SPROC가 어떻게 사용하는지 확인하기 위해 매개 변수를 "스니핑"합니다. 그런 다음 SQL Server는 결과에 따라 실행 계획을 생성합니다. Sproc을 처음 실행할 때는 좋지만 보고서를 실행할 때 마다이 작업을 수행하는 것을 원하지 않습니다. 그래서 스프로의 상단에 새로운 변수 세트를 선언하여 쿼리에 전달 된 매개 변수를 간단히 저장하고 쿼리 전체에 새로운 매개 변수를 사용합니다.

예시:

CREATE PROCEDURE [dbo].[usp_REPORT_ITD001]
@StartDate DATETIME,
@EndDate DATETIME,
@ReportTab INT
AS

-- Deter parameter sniffing
DECLARE @snf_StartDate DATETIME = @StartDate
DECLARE @snf_EndDate DATETIME = @EndDate
DECLARE @snf_ReportTab INT = @ReportTab

... 이는 SPORC가 SSR에 의해 실행될 때 쿼리 전체가 아닌 전달 된 매개 변수에 대한 쿼리의 처음 몇 행만을보고 있음을 의미합니다. SSR에서 실행 시간이 상당히 줄어 듭니다.

  1. SPROC에 변수로 선언 된 온도 테이블이 많은 경우DECLARE @MyTable AS TABLE), 이들은 보고서를 생성 할 때 서버 (메모리 측면에서)에서 실제로 집중적입니다. 해시 온도 테이블을 사용하여 (SELECT MyCol1, MyCol2 INTO #MyTable) 대신, SQL Server는 Temp 테이블을 시스템 기억이 아닌 서버에 TempDB에 저장하여 보고서 생성이 덜 집중적입니다.

저장 프로 시저의 작성 명세서에 다시 컴파일 옵션을 사용하여 언젠가 추가하면 도움이됩니다. 이는 절차에 의해 탐색 된 레코드 수가 원래 실행 계획이 최적이 아닌 방식으로 변경되는 상황에서 효과적입니다.

기본적으로 지금까지 내가 한 것은 스프로를 조금 더 최적화하는 것이었고 적어도 일시적으로 문제를 해결하는 것 같습니다.

SSMS와 SSRS에서 Sproc을 호출하는 것의 차이점이 무엇인지 여전히 알고 싶습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top