2

TVP (테이블 반환 매개 변수)를 사용하여 쿼리 성능을 향상시키는 방법을 몇 시간 동안 인터넷에서 검색했습니다.예상 행 개수의 테이블 값 매개 변수 1

검색 시간이 지나자 마침내 나는 문제의 근본 원인이라고 판단했습니다. 내 쿼리의 예상 실행 계획을 검토 한 결과, TVP를 사용할 때마다 쿼리의 예상 행 수가 1임을 알게되었습니다. 관심있는 데이터를 선택하는 쿼리에 대해 TVP를 교환하면 7400 년경에 예상되는 행 수가 훨씬 정확 해집니다. 이로 인해 성능이 크게 향상됩니다.

그러나 실제 시나리오에서는 쿼리를 사용할 수 없으며 TVP를 사용해야합니다. 더 적절한 계획을 사용하기 위해 TVP를 사용할 때 SQL Server에서 행 수를 더 정확하게 예측할 수있는 방법이 있습니까?

+0

테이블 값 변수에 대한 업데이트 통계를 사용할 수 있습니까? – Dannyg9090

+1

@ Dannyg9090 아니요, 임시 변수는 통계를 저장하지 않습니다. –

답변

3

TVP는 통계를 유지하지 않으므로보고가 1 행만있는 테이블 변수입니다. 당신이 TVP의 값 중 하나를 수정하거나 운영 데이터를 추적하는 데에 열을 추가 할 필요가없는 경우

  1. 는, 당신은 간단하고, 명령문 - 작업을 수행 할 수 있습니다 TVPs에 대한 통계를 개선하는 방법에는 두 가지가 있습니다 레벨 OPTION (RECOMPILE)은 테이블 변수 (TVP 또는 로컬로 작성된)를 사용하며 단순한 SELECT보다 더 많은 일을합니다 (즉, INSERT INTO RealTable (columns) SELECT (columns) FROM @TVP;을 수행하면 명령문 레벨 재 컴파일이 필요하지 않습니다). 행동이 동작을 볼 수 SSMS에서 다음 테스트를 수행합니다

    DECLARE @TableVariable TABLE (Col1 INT NOT NULL); 
    
    INSERT INTO @TableVariable (Col1) 
        SELECT so.[object_id] 
        FROM [master].[sys].[objects] so; 
    
    -- Control-M to turn on "Include Actual Execution Plan" 
    
    SELECT * FROM @TableVariable; -- Estimated Number of Rows = 1 (incorrect) 
    
    SELECT * FROM @TableVariable 
    OPTION (RECOMPILE); -- Estimated Number of Rows = 91 (correct) 
    
    SELECT * FROM @TableVariable; -- Estimated Number of Rows = 1 (back to incorrect) 
    
  2. 그에게 TVP 데이터를 (# 단일) 로컬 임시 테이블을 작성하고 복사합니다. 이 tempdb의 데이터를 중복 않지만, 이점은 다음과 같습니다 테이블 변수에 반대되는 임시 테이블에 대한

    • 더 나은 통계 열을 추가 할 수
    • 능력 (즉 문 수준이 필요 다시 컴파일하지 않음)
    • 값 수정 기능
+0

RECOMPILE이 추정 문제를 실제로 수정합니까? TVP에 대한 통계는 없습니다. – usr

+1

@usr 예, _statement-level_ RECOMPILE은 해당 query_에 대해 올바른 행 개수 _를 점유합니다. 테이블 변수에 대한 통계가 유지 관리되지 않으므로 행 개수는 불행하게도 해당 테이블 변수를 참조하는 후속 쿼리로 전달되지 않습니다. 나는 그것이 작동한다는 것을 보여주는 테스트로 나의 대답을 업데이트했다. –

+0

@usr 예, 다음은 Aaron Bertrand의 멋진 기사입니다. http://sqlperformance.com/2014/06/t-sql-queries/table-variable-perf-fix – JJS

관련 문제