2011-11-25 2 views
1

매우 큰 테이블을 가지고 있으며 월별 범위를 사용하여 날짜별로 파티션을 나누었습니다.런타임에 파티션 정리 기능이 작동하는지 확인하려면 어떻게해야합니까?

하드 값을 지정하는 쿼리가 실행 계획에서 적절한 파티션 정리를 수행한다는 것을 알게되었습니다. (WHERE DATE_KEY = '1/1/2011'). 해당 달의 파티션 만 검사합니다.

그러나 변수 (WHERE DATE_KEY = @DATE_KEY)을 사용하면 저장 프로 시저에서 SQL Server가 모든 파티션을 검색합니다.

그래서 SQL Server는 런타임과 달리 실행 계획을 캐싱 할 때 파티션 정리를 수행합니다. 이상적이지 않습니다.

해결 방법은 동적 SQL 대신 EXEC('...WHERE DATE_KEY=''' + @DATE_KEY+ '''')을 사용하는 것입니다. 어떤 작품이지만 아주 우아하지 않습니다.

동적 SQL을 거치지 않고이 작업을 제대로 수행하는 데 사용할 수있는 스위치 또는 일부 매개 변수가 있는지 궁금합니다. 일부 가상의 "SET COMPILE_PLAN_AT_RUNTIME ON" 또는 뭐라고 말하면 ....

답변

0

쿼리를 다시 컴파일하려면 RECOMPILE query hint을 사용하십시오.

저장 프로 시저를 다시 컴파일하려면 recompiling stored procedures을 확인하십시오. 다음과 같이 할 수 있습니다 :

  • 저장 프로 시저 정의에서 WITH RECOMPILE로 표시 - SQL Server는 각 실행 전에 프로 시저를 다시 컴파일합니다. 저장 프로 시저가 자주 호출되는 경우 성능 적중을 조심하십시오. CREATE PROCEDURE
  • 각 EXEC 문의 끝에 RECOMPILE 함께 추가 확인 :

또한 첫번째 다음 실행에 재 컴파일을 강제로 EXEC sp_my_procedure WITH RECOMPILE

  • 사용 sp_recompile, 당신은 특정에 저장 프로 시저 내에서 RECOMPILE 쿼리 힌트를 사용하여 시도 할 수 있습니다 질문.

    재 컴파일이 비싸기 때문에 성능을 테스트하는 것을 잊지 마십시오.

  • 4
    1. 사용 RECOMPILE 쿼리 힌트 : 매개 변수와 열이 비교되는 것을
      OPTION(RECOMPILE)

    2. 이 있는지 확인의 데이터 형식은 다음과 같습니다
      (WHERE DATE_KEY = @DATE_KEY)

    +0

    수 2는 고정 우리 특히 우리는 작은 날짜 시간을 사용하여 분할 된 테이블을 가지고 있었고 매개 변수를 작은 날짜 시간에 명시 적으로 캐스팅하지 않으면 SQL을 사용하거나 C# 코드에서 param 유형을 SqlDbType.SmallDateTime으로 적용하면 파티션 제거가 발생하지 않습니다. SQL Server 작동 방식에 대한 자세한 내용 : http://sqlblog.com/blogs/paul_white/archive/2012/09/12/why-doesn-t-partition-elimination-work.aspx –

    관련 문제