저장된 절차가 몇 초 안에 결과를 기준으로 할 때 SSR이 시간을보고하는 이유는 무엇입니까?
-
04-07-2019 - |
문제
저장된 절차에서 데이터를 반환 한 보고서가 있습니다. Profiler를 사용하여보고 서비스에서 저장된 절차에 대한 호출을 포착 할 수 있습니다.
보고서는 보고서가 시간을 초과 한 것으로 밝혀졌지만 SSMS에서 저장된 절차를 실행할 수 있으며 5 초에서 6 초 안에 데이터를 다시 반환합니다.
예제 테스트에서 테스트 실행은 저장된 절차 내에서 보고서 서비스로 전달 된 결과를 다시 수집하기 위해 수천 또는 수백만의 레코드가 작동했을 수 있지만 렌더링을 위해 보고서로 두 개의 행만 반환됩니다.
저장된 절차가 더 많이 최적화 될 수 있다는 것을 알고 있지만 실행이 SSM에서 실행하는 데 몇 초만 걸릴 때 SSRS가 타이밍을하는 이유를 이해하지 못합니다.
또한 또 다른 문제가 나타났습니다. 저장된 절차를 재현하면 보고서가 다시 완벽하게 렌더링되기 시작합니다. 짧은 기간이 지나면 보고서가 다시 시작되기 시작합니다.
Time Out의 반환은 보고서가 실행중인 메인 테이블에 새로운 데이터가 추가되는 것과 관련이있는 것 같습니다. 내가 테스트하고있는 예에서, 100 개의 새로운 레코드 만 삽입 한 것으로 보고서를 망칠 수있었습니다.
나는 근본 원인 인 보고서가 더 정확하다고 생각합니다. SSR에서 실행될 때 시간을 초래하는 것은 저장된 절차입니다.
일단 다시 시간이 다가 오면 지금까지 내가 가진 최선의 수정은 저장된 절차를 재현하는 것입니다. 이것은 이상적인 솔루션이 아닌 것 같습니다.
문제는 또한 생산 환경에서만 발생하는 것 같습니다. 우리의 시험 및 개발 플랫폼은 동일한 문제를 나타내지 않는 것 같습니다. Dev와 Test는 생산과 동일한 양의 레코드를 가지고 있지 않지만.
해결책
설명했듯이 문제는 저장된 절차의 일부 부품의 실행 계획에 대한 변형에서 비롯된 것 같습니다. 사용 된 테이블에 보관 된 통계와 새 행을 추가하는 것이 어떤 영향을 미치는지 살펴보십시오.
열 범위의 끝에 많은 행을 추가하는 경우 (자가 주민 또는 타임 스탬프를 추가하는 것에 대해 생각하십시오) 해당 열의 히스토그램은 빠르게 구식이됩니다. 업데이트 통계 문을 실행하여 T-SQL의 즉각적인 업데이트를 강제 할 수 있습니다.
다른 팁
또한 스프로가 실행하는 데 몇 초가 걸리지 만 SSRS는 단순히 시간을 보내는이 문제를 겪었습니다.
나는 내 자신의 경험 에서이 문제를 극복하기위한 몇 가지 다른 방법이 있음을 발견했습니다.
- 매개 변수 스니핑입니다! 저장 프로 시저가 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에서 실행 시간이 상당히 줄어 듭니다.
- SPROC에 변수로 선언 된 온도 테이블이 많은 경우
DECLARE @MyTable AS TABLE
), 이들은 보고서를 생성 할 때 서버 (메모리 측면에서)에서 실제로 집중적입니다. 해시 온도 테이블을 사용하여 (SELECT MyCol1, MyCol2 INTO #MyTable
) 대신, SQL Server는 Temp 테이블을 시스템 기억이 아닌 서버에 TempDB에 저장하여 보고서 생성이 덜 집중적입니다.
저장 프로 시저의 작성 명세서에 다시 컴파일 옵션을 사용하여 언젠가 추가하면 도움이됩니다. 이는 절차에 의해 탐색 된 레코드 수가 원래 실행 계획이 최적이 아닌 방식으로 변경되는 상황에서 효과적입니다.
기본적으로 지금까지 내가 한 것은 스프로를 조금 더 최적화하는 것이었고 적어도 일시적으로 문제를 해결하는 것 같습니다.
SSMS와 SSRS에서 Sproc을 호출하는 것의 차이점이 무엇인지 여전히 알고 싶습니다.