복붙노트

[SQL] OPTION (RECOMPILE)는 항상 빠른입니다; 왜?

SQL

OPTION (RECOMPILE)는 항상 빠른입니다; 왜?

를 생략하면 쿼리가 훨씬 넘는 5 분 소요됩니다 동안 나는 나의 쿼리에 OPTION (RECOMPILE)를 추가하면이 0.5 초에서 실행됩니다 이상한 상황이 발생했습니다.

쿼리를 SqlCommand.ExecuteReader를 통해 쿼리 분석기에서 또는 내 C # 프로그램에서 실행될 때 이러한 경우가 (). DBCC FREEPROCCACHE 또는 DBCC DROPCLEANBUFFERS를 호출 (또는 호출하지 않으면) 차이가 없습니다; 쿼리 결과는 항상 OPTION (RECOMPILE)과없는 큰 5 분으로 즉시 반환됩니다. 쿼리는 항상 [이 시험을 위해서] 같은 매개 변수와 함께 호출된다.

나는 SQL Server 2008을 사용하고 있습니다.

나는 SQL을 쓰기에 매우 편안 해요하지만 전에 쿼리에서 옵션 명령을 사용한 적이 및이 포럼에 게시물을 스캔 할 때까지 계획 캐시의 전체 개념에 익숙했다. 게시물에서 나의 이해는 OPTION (RECOMPILE)는 비용이 많이 드는 작업이다. 그것은 분명히 쿼리에 대한 새로운 검색 전략을 만듭니다. 그래서 이유는 OPTION (RECOMPILE)를 생략 후속 쿼리가 느린 것을, 다음입니까? 다음의 쿼리는 재 컴파일 힌트를 포함 이전 호출에 계산 된 조회 전략을 활용하지할까요?

그것은 모든 단일 통화에 재 컴파일 힌트를 필요로하는 쿼리를 가지고 매우 이례적인가요?

죄송하지만, 엔트리 레벨의 질문에 대한 난 정말이의 머리 또는 꼬리를 만들 수 없습니다.

업데이트 : 쿼리를 게시하도록 요청했습니다 ...

select acctNo,min(date) earliestDate 
from( 
    select acctNo,tradeDate as date 
    from datafeed_trans 
    where feedid=@feedID and feedDate=@feedDate 

    union 

    select acctNo,feedDate as date 
    from datafeed_money 
    where feedid=@feedID and feedDate=@feedDate 

    union 

    select acctNo,feedDate as date 
    from datafeed_jnl 
    where feedid=@feedID and feedDate=@feedDate 
)t1 
group by t1.acctNo
OPTION(RECOMPILE)

쿼리 분석기에서 테스트를 실행할 때, 나는 다음 줄을 앞에 추가 :

declare @feedID int
select @feedID=20

declare @feedDate datetime
select @feedDate='1/2/2009'

내 C # 프로그램에서 호출 할 때 매개 변수는 SqlCommand.Parameters 속성을 통해 전달됩니다.

이 토론의 목적을 위해, 당신은 우리가 원인으로 냄새 차선의 매개 변수를 배제 할 수 있도록 매개 변수를 변경하지 않을 것으로 가정 할 수있다.

해결법

  1. ==============================

    1.OPTION (RECOMPILE)를 사용하는 것은 의미가 있다고 시간이있다. 당신이 동적 SQL을 사용하는 경우 내 경험에 의하면이 실행 가능한 옵션이있는 유일한 시간이다. 당신이이 상황에서 의미가 있는지 여부를 조사하기 전에 내가 통계를 다시 추천 할 것입니다. 이것은 다음을 실행하여 수행 할 수 있습니다 :

    OPTION (RECOMPILE)를 사용하는 것은 의미가 있다고 시간이있다. 당신이 동적 SQL을 사용하는 경우 내 경험에 의하면이 실행 가능한 옵션이있는 유일한 시간이다. 당신이이 상황에서 의미가 있는지 여부를 조사하기 전에 내가 통계를 다시 추천 할 것입니다. 이것은 다음을 실행하여 수행 할 수 있습니다 :

    EXEC sp_updatestats
    

    그리고 당신의 실행 계획을 다시. 이것은 당신의 실행 계획을 만들 때이 최신 정보를 사용하게 될 것을 보장합니다.

    OPTION (RECOMPILE)를 추가하면 실행 계획을 쿼리가 실행 할 때마다 다시 작성합니다. 나는 새로운 검색 전략을 생성 설명 것을 들어 본 적이없는하지만 어쩌면 우리는 단지 같은 일에 대해 서로 다른 용어를 사용하고 있습니다.

    저장 프로 시저가 작성 될 때 SQL 서버 시도를이 쿼리에 대한 가장 효과적인 실행 계획을 결정하기 위해 (나는 다음 저장된 프로 시저 호출 되 고이 끝이 당신 .NET에서 임시 SQL을 요구하고 있지만 매개 변수가있는 쿼리를 사용하는 경우 의심) 데이터베이스의 데이터와 (매개 변수 스니핑)에 전달 된 매개 변수를 기반으로하고이 계획을 캐시합니다. 당신은 100,000,000 기록이있는 경우를 실행 한 후 데이터베이스에 10 개 개의 레코드가 쿼리를 작성하는 경우이 방법은 캐시 된 실행 계획은 더 이상 가장 효과적인하지 않을 수 있음.

    요약 - 나는 OPTION (RECOMPILE)이 여기에 도움이 될 것이라고 어떤 이유가 표시되지 않습니다. 나는 당신이 당신의 통계와 실행 계획을 업데이트해야합니다 생각한다. 통계를 재 구축 상황에 따라 DBA 작업의 필수적인 부분이 될 수 있습니다. 당신은 여전히 ​​당신의 통계를 업데이트 한 후 문제가있는 경우, 둘 다 실행 계획을 게시 건의 할 것입니다.

    그리고 당신의 질문에 대답 - 그래, 나는 당신의 최선의 선택은 실행 계획 쿼리를 실행할 때마다 다시 컴파일하는 것은 매우 이례적인 일이다 말할 것입니다.

  2. ==============================

    2.쿼리의 실행 실행에서 급격한 차이가 종종 때 나는 종종 5 개 문제 중 하나는 사실을 알게 될 것입니다.

    쿼리의 실행 실행에서 급격한 차이가 종종 때 나는 종종 5 개 문제 중 하나는 사실을 알게 될 것입니다.

    쿼리를 작성할 때 일반적으로, 당신은 당신의 테이블 내에서 배포 대략 어떻게 특정 데이터의 일부 정신 사진이 있어야합니다. 예를 들어 열이 다른 값의 균일 분산을 가질 수 있거나 비스듬 할 수 있고, 시간의 80 %가 분포가 시간이 지남에 따라 자주 변화 여부, 특정 값이 설정되어 또는 상당히 정적. 이렇게하면 효율적인 쿼리를 작성하는 방법의 더 나은 아이디어를 줄 것이다. 그러나 또한 디버깅 쿼리 성능은 느리거나 비효율적 인 이유에 대한 가설을 구축하기위한 기반을 가지고있다.

  3. ==============================

    3.OPTION (RECOMPILE)이 매우 도움이 될 수있는 상황 (@CodeCowboyOrg에 의해 주어진) 우수한 목록에 추가하려면,

    OPTION (RECOMPILE)이 매우 도움이 될 수있는 상황 (@CodeCowboyOrg에 의해 주어진) 우수한 목록에 추가하려면,

  4. ==============================

    4.쿼리를 실행하는 조각 모음에있는 첫 번째 행동하기 전에 / 인덱스와 통계를 다시, 다른 방법은 당신은 당신의 시간을 낭비하고 있습니다.

    쿼리를 실행하는 조각 모음에있는 첫 번째 행동하기 전에 / 인덱스와 통계를 다시, 다른 방법은 당신은 당신의 시간을 낭비하고 있습니다.

    당신은 (각 테이블이 경우) 커버 인덱스를 만들어야 할 수도하지 않을 경우 하나를 만들 수 있습니다 당신은 일 시스템을 알고 ((당신이 매개 변수를 변경할 때 동일) 그것의 안정이 있는지 확인하기 위해 실행 계획을 확인해야하는 다른 쿼리도)를 위해 유용합니다.

    예로서 :   인덱스 idx01_datafeed_trans를 만들    datafeed_trans에 (feedid, feedDate)      INCLUDE (acctNo, tradeDate)

    계획이 안정 또는 당신이 그것을 안정화 할 수 있다면 당신은 저장하고 고정 된 실행 계획을 사용하는 sp_executesql을 가진 문장 ( 'SQL 문장')을 실행할 수 있습니다.

    계획이 불안정한 경우 평가 및 실행 계획 매번 생성하는 임시 문이나 EXEC ( 'SQL 문장')를 사용해야합니다. (또는 저장 프로 시저 "재 컴파일")를 사용하는 것입니다.

    희망이 도움이.

  5. ==============================

    5.이 질문에 Necroing하지만 아무도 생각 것 같다 없다고 설명이있다.

    이 질문에 Necroing하지만 아무도 생각 것 같다 없다고 설명이있다.

    통계 - 통계를 사용할 수 또는 오해의 소지가 없습니다

    다음 모두에 해당하는 경우 :

    다음 SQL Server 잘못 열이 선택되는 제한과 가난한 실행 계획을 모두 적용 예상 카디널리티 추정치보다 낮은 선도, 상관된다고 가정 할 수있다. 이 경우 수정은 비용이 많이 드는 작업하지 않은 두 개의 열을 연결하는 통계 개체를 생성하는 것입니다.

  6. from https://stackoverflow.com/questions/20864934/option-recompile-is-always-faster-why by cc-by-sa and MIT license