통계를 업데이트 할 때 샘플링은 어떻게 작동합니까? 최신 상태로 유지하고

거대한 테이블이 몇 개 있습니다. 주간 유지 보수 계획을 통해 통계를 최신 상태로 유지하고 싶습니다.

그러나 그렇게하는 데 너무 많은 시간이 걸립니다.

내가 지정하면

WITH SAMPLE 50 PERCENT

그런 다음 SQL Server는 다음을 샘플링합니다.

  1. 페이지의 첫 50 %
  2. 다른 모든 페이지
  3. 아니면 다른 전략?

BOL 은 이것에 대해 명확하지 않습니다.



답변

를 들어 WITH SAMPLE 50 PERCENTSQL Server가 동전을 뒤집 테이블의 각 데이터 페이지에 대한 것처럼 작동합니다. 헤드에 도달하면 페이지의 모든 행을 읽습니다. 꼬리가 떨어지면 아무것도 읽지 않습니다.

UPDATE STATISTICS T WITH SAMPLE 50 PERCENT프로파일 러 에서 호출을 추적하면 다음 쿼리가 생성됩니다.

SELECT StatMan([SC0], [SB0000])
FROM   (SELECT TOP 100 PERCENT [SC0],
                               step_direction([SC0]) OVER (ORDER BY NULL) AS [SB0000]
        FROM   (SELECT [C] AS [SC0]
                FROM   [dbo].[T] TABLESAMPLE SYSTEM (5.000000e+001 PERCENT)
                WITH (READUNCOMMITTED)) AS _MS_UPDSTATS_TBL_HELPER
        ORDER  BY [SC0],
                  [SB0000]) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 1) 

계획

TABLESAMPLE SYSTEM (5.000000e+001 PERCENT)샘플링을 책임지고 여기에 문서화되어 있습니다.

TABLESAMPLE SYSTEM대략적인 행 백분율을 반환하고 테이블의 각 실제 8KB 페이지에 대해 임의의 값을 생성합니다. 페이지의 임의 값과 쿼리에 지정된 백분율에 따라 페이지가 샘플에 포함되거나 제외됩니다. 포함 된 각 페이지는 샘플 결과 세트의 모든 행을 리턴합니다.

이 문서에는 또한

계획에 테이블 스캔이 수행 된 것으로 표시되지만 결과 세트에 포함 된 페이지 만 실제로 데이터 파일에서 읽어야합니다.

STATMAN내부에 집합 함수 호출은 간단히 설명 여기