다음을 통해 공유


읽을 수 있는 보조 데이터베이스에 대한 지속형 통계

적용 대상:적용 대상:Microsoft Fabric Preview의 SQL Server 2025(17.x) 미리 보기 Azure SQL Database SQL Database

읽기 가능한 보조 데이터베이스에 대한 쿼리 저장소 는 SQL Server 2022(16.x)에 도입되었으며 읽기 가능한 보조 기능에 대한 지속형 통계는 읽기 가능한 보조 데이터베이스에 대해 쿼리 저장소가 마련한 인프라를 사용합니다. 읽기 가능한 보조 데이터베이스에 대한 쿼리 저장소는 SQL Server 2025(17.x) 미리 보기에서 기본적으로 활성화되어 있는 반면, SQL Server 2022(16.x)에서는 비활성화되어 있었고 이를 활성화하려면 추적 플래그 12606이 필요했습니다.

추적 플래그 12606은 SQL Server 2025(17.x) 미리 보기 이상 버전에서 필요하지 않으며 , 사용되는 경우 읽을 수 있는 보조 기능에 대한 쿼리 저장소를 해제합니다.

Background

읽을 수 있는 보조 복제본에서 자동 만들기 통계 옵션을 사용하도록 설정하면 통계를 자동으로 만들 수 있지만 인스턴스를 다시 시작할 때 해당 통계는 일시적이고 사라집니다. 읽기 전용 데이터베이스 또는 읽기 전용 스냅샷에 대한 통계가 없거나 유효하지 않을 경우 데이터베이스 엔진은 tempdb에서 임시 통계를 만들어 유지 관리합니다.

데이터베이스 엔진이 임시 통계를 만들 때 임시 통계와 영구 통계를 구분하기 위해 통계 이름에 접미사가 _readonly_database_statistic 추가됩니다. 접미사는 _readonly_database_statistic SQL Server에서 생성된 통계용으로 예약되어 있습니다. 이 방법을 사용한 이유는 주 복제본에 존재하지 않는 고유한 통계가 필요할 수 있는 읽기 가능한 보조 복제본에 대해 실행되는 워크로드를 해결하기 위한 것이었습니다.

보조 복제본에서 만든 임시 통계는 생성된 복제본에만 표시됩니다. 주 복제본은 이러한 임시 통계 개체에 직접 액세스하지 않으며 지속성 후에만 영구 통계 개체를 인식합니다. 임시 통계가 주 복제본에 유지되면 동기화 메커니즘을 통해 가용성 그룹의 모든 복제본에서 사용할 수 있게 됩니다. 지속성 메커니즘은 SQL Server 2022(16.x)에 도입된 읽기 가능한 보조 인프라에 쿼리 저장소를 사용합니다. 통계 정보는 영구 통계로 유지된 주 복제본으로 전송된 다음, 모든 보조 복제본으로 다시 동기화됩니다. 이 프로세스는 수동 개입 없이 자동으로 발생합니다.

카탈로그 뷰 지원

통계 생성 또는 업데이트를 보조 열과 기본 항목 간의 비교를 지원하고 통계가 만들어진 위치를 이해하는 데 도움이 되도록 카탈로그 뷰에 세 개의 새 열이 sys.stats 추가되었습니다.

열 이름 데이터 형식 Description
replica_role_id tinyint 1 = 주(primary), 2 = 보조(secondary), 3 = 지리적 보조(Geo Secondary), 4 = 지리적 고가용성 보조(Geo HA Secondary)
replica_role_desc nvarchar(60) 기본, 보조, 지리적 보조, 지리적 HA 보조
replica_name sysname 가용성 그룹에 있는 복제본의 인스턴스 이름입니다. NULL 주 복제본의 경우

이러한 열은 지속성 수명 주기 동안 통계 소유권 및 원본을 추적합니다. 보조 복제본이 임시 통계를 만들고 주 복제본에 유지되는 경우 replica_role_id 및 replica_name 열은 원래 복제본을 식별합니다. 이러한 영구 통계가 나중에 주 복제본에서 업데이트되는 경우 소유권은 주 복제본으로 이전되며, 이는 이러한 열에 반영됩니다.

통계 지속성 기능

보조 복제본에서 주 복제본으로 임시 통계가 유지되는 경우 몇 가지 중요한 동작이 발생합니다. 보조 복제본의 임시 통계는 지속성 후에 자동으로 제거되지 않습니다. 원래 이러한 임시 통계 생성을 트리거한 쿼리는 쿼리가 다시 컴파일되거나 복제본이 다시 시작될 때까지 계속 사용합니다. 즉, 동일한 통계의 임시 및 영구 버전이 일시적으로 공존할 수 있습니다.

최적화 프로그램은 통계를 사용할지 여부를 결정할 때 복제본 소유권을 고려하지 않습니다. 열 범위 및 선택성 추정치에 따라 사용 가능한 모든 통계를 평가합니다. 복제본 정보는 주로 추적 및 문제 해결을 위해 유지 관리됩니다.

주목할 만한 시나리오는 임시 통계에서 생성된 영구 통계가 부실해지면 발생합니다. 해당 통계의 열에 영향을 주는 기본 데이터 수정이 발생하는 경우 영구 통계는 부실한 것으로 간주될 수 있습니다. 보조 복제본에 대한 쿼리가 이러한 열을 참조하는 경우 보조 복제본은 다시 실행 프로세스를 통해 적용된 수정 내용을 반영하여 데이터 뷰에 따라 통계를 업데이트합니다.

즉, 지속성은 부실 통계를 새로 고치는 보조의 기능을 제거하지 않습니다. 복제본 간에 통계를 공유하는 메커니즘을 추가하기만 하면 됩니다.

Observability

확장 이벤트

persisted_stats_operation(운영 채널)은 enqueued , dequeued , processedfailed 이벤트에 대해 발생합니다. 이 기능은 통계 메시지를 주 서버에 저장할 수 없거나 메시지 처리 기능을 관찰하는 데 관심이 있는 경우 이를 모니터링하는 데 유용할 수 있습니다. 주 복제본과 보조 복제본 간에 통신 문제가 있는 경우 백그라운드 프로세스에서 tempdb 메시지 전송을 다시 시도하면서 임시 통계는 보조 복제본에 남아 있습니다.

  • 9131: SQL을 시작하는 동안 기능을 사용할 수 없습니다.
  • 9136: 테이블 또는 인덱스가 삭제/수정되었습니다.
  • 9137: 스냅샷 트랜잭션이 시작된 이후 스키마가 변경되었습니다. 재시도.
  • 9139: 통계가 너무 커서 주 복제본으로 보낼 수 없습니다.

다음 쿼리는 보조 복제본에서 유지되는 통계를 포함하여 테이블의 통계에 대한 가시성을 제공할 수 있습니다.

SELECT sch.[name] AS SchemaName,
       obj.[name] AS TableName,
       s.[name] AS StatsName,
       CASE WHEN s.stats_id >= 2 AND s.auto_created = 1 THEN 'AUTO_STATS'
           WHEN s.stats_id >= 2 AND s.auto_created = 0 THEN 'USER_CREATED_STATS'
           ELSE 'INDEX_STATS'
       END AS type,
       s.is_temporary,
       CASE WHEN s.replica_name IS NULL
                 AND s.replica_role_desc = 'PRIMARY'
                 AND s.stats_id >= 2
                 AND s.auto_created = 1 THEN 'PRIMARY' ELSE s.replica_name
       END AS replica_name,
       s.replica_role_id,
       s.replica_role_desc
FROM sys.schemas AS sch
     INNER JOIN sys.objects AS obj
         ON sch.schema_id = obj.schema_id
     INNER JOIN sys.stats AS s
         ON obj.object_id = s.object_id
WHERE sch.[name] <> 'sys'
ORDER BY sch.[name], obj.[name], s.stats_id;

고려 사항

자동 만들기 통계 옵션이 사용 설정되어 있고, READABLE_SECONDARY_TEMPORARY_STATS_AUTO_CREATEREADABLE_SECONDARY_TEMPORARY_STATS_AUTO_UPDATE 데이터베이스 범위 구성 옵션이 기본적으로 사용 설정되어 있는 경우, 읽기 가능한 보조 기능에 대한 지속형 통계는 기본적으로 활성화됩니다. 기능을 켜고 끄기 위한 데이터베이스 범위 설정이 존재하지 않습니다.