giip
SES 안건 등록
SQL Server중간統計情報性能インデックス

SQL Server에서 테이블별 통계 정보 업데이트 일시를 확인하는 SQL

공개일 2026-08-13 · 업데이트일 2026-08-13 · 최종 검증일 2026-08-13

결론

SQL Server에서는 `sys.stats`와 `STATS_DATE()`를 사용해 테이블 및 통계별 최종 업데이트 일시를 확인할 수 있습니다. SQL Server 2008 R2 SP2 / 2012 SP1 이후라면 `sys.dm_db_stats_properties`를 함께 사용해 마지막 업데이트 이후 변경된 행 수(`modification_counter`)까지 동시에 가져올 수 있습니다. 아래 SQL은 데이터와 설정을 변경하지 않는 참조 전용 쿼리로, 운영 환경에서도 그대로 실행할 수 있습니다.

이 문서의 적용 조건

대상 제품SQL Server / Amazon RDS for SQL Server / Azure SQL Managed Instance
확인된 버전SQL Server 2008 이후(`sys.dm_db_stats_properties`는 2008 R2 SP2 / 2012 SP1 이후)
적용 환경온프레미스, EC2, Amazon RDS, Azure
필요 권한대상 데이터베이스에 대한 연결 권한과 대상 개체의 메타데이터 가시성(`sys.stats`는 메타데이터 가시성 규칙을 따르며, 권한이 없는 개체는 행으로 반환되지 않습니다)
실행 영향확인용 SQL은 참조만 합니다(데이터·설정을 변경하지 않습니다). 대응 절차로 소개한 `UPDATE STATISTICS`는 통계 재생성과 플랜 재컴파일을 수반합니다.
재시작불필요
최종 검증일2026-08-13

바로 실행할 수 있는 명령

통계별 최종 업데이트 일시와 변경 행 수(SQL Server 2012 SP1 이후 권장)참조만
対象
SQL Server 2008 R2 SP2 / 2012 SP1 이후
権限
대상 DB에 대한 연결 권한 + 대상 개체의 메타데이터 가시성
変更作業
없음(참조만)
Production実行
가능
-- 対象: SQL Server 2008 R2 SP2 / 2012 SP1 以降
-- 権限: 対象DBへの接続権限(sys.stats はメタデータ可視性ルールに従う)
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
    SCHEMA_NAME(o.schema_id)              AS schema_name,
    o.name                                AS table_name,
    s.name                                AS stats_name,
    s.auto_created                        AS is_auto_created,
    STATS_DATE(s.object_id, s.stats_id)   AS last_updated,
    sp.rows                               AS table_rows,
    sp.rows_sampled                       AS rows_sampled,
    sp.modification_counter               AS rows_modified_since_update
FROM sys.stats AS s
INNER JOIN sys.objects AS o
        ON s.object_id = o.object_id
CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS sp
WHERE o.is_ms_shipped = 0          -- システムオブジェクトを除外
  AND o.type IN ('U', 'V')         -- ユーザーテーブルとビュー
ORDER BY sp.modification_counter DESC, last_updated ASC;

`CROSS APPLY`는 통계가 없는 개체의 행을 제외하므로, 통계가 하나도 없는 테이블은 결과에 나타나지 않습니다. 테이블의 전체 커버리지를 우선하려면 `OUTER APPLY`로 변경하십시오.

SQL Server 2008(`sys.dm_db_stats_properties`가 없는 환경)참조만
対象
SQL Server 2008(RTM~SP1 포함)
権限
대상 DB에 대한 연결 권한
変更作業
없음(참조만)
Production実行
가능
-- 対象: SQL Server 2008(sys.dm_db_stats_properties が使えない環境)
-- 権限: 対象DBへの接続権限
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
    SCHEMA_NAME(o.schema_id)            AS schema_name,
    o.name                              AS table_name,
    s.name                              AS stats_name,
    s.auto_created                      AS is_auto_created,
    s.no_recompute                      AS is_no_recompute,
    STATS_DATE(s.object_id, s.stats_id) AS last_updated
FROM sys.stats AS s
INNER JOIN sys.objects AS o
        ON s.object_id = o.object_id
WHERE o.is_ms_shipped = 0
  AND o.type IN ('U', 'V')
ORDER BY last_updated ASC;

이 버전에서는 변경된 행 수를 가져올 수 없습니다. 업데이트 필요 여부는 행 수 증감이나 작업 실행 이력과 함께 판단합니다.

특정 통계만 업데이트(변경을 수반하므로 사전 검토 필요)중간
対象
SQL Server 2008 이후
権限
대상 테이블의 소유자, 또는 db_owner / db_ddladmin
変更作業
있음(통계 재생성과 플랜 캐시 재컴파일)
Production実行
실행 가능하지만 부하가 낮은 시간대를 선택할 것
-- 対象: SQL Server 2008 以降
-- 権限: 対象テーブルの所有者 または db_owner / db_ddladmin
-- 変更作業: あり(統計更新 → 該当オブジェクトのプラン再コンパイル)
-- Production 実行: 可能だが I/O とCPUを消費するため時間帯を選ぶこと
UPDATE STATISTICS [dbo].[SampleTable] ([IX_SampleTable_01])
    WITH FULLSCAN;

`WITH FULLSCAN`은 전체 행을 읽으므로 큰 테이블에서는 I/O가 급증합니다. 먼저 기본 샘플링(옵션 생략)으로 업데이트하고, 추정 행 수가 개선되지 않을 경우에 `FULLSCAN`을 검토하십시오.

결과 해석 방법

열의미확인할 포인트
schema_name스키마 이름대상 스키마가 예상과 일치하는지
table_name테이블 이름행 수가 많은 테이블을 우선적으로 확인
stats_name통계 이름인덱스 통계(인덱스와 동일한 이름)와 자동 생성 통계(`_WA_Sys_`로 시작)를 구분
is_auto_created자동 생성된 통계인지1이면 AUTO_CREATE_STATISTICS에 의한 자동 생성
last_updated최종 업데이트 일시NULL(미업데이트)이거나 명백히 오래된 날짜가 없는지
table_rows통계가 대상으로 하는 행 수실제 행 수와 크게 차이나지 않는지
rows_sampled샘플링된 행 수`table_rows`에 비해 극단적으로 적으면 추정 정확도가 낮아짐
rows_modified_since_update최종 업데이트 이후 변경된 행 수값이 큰 행이 업데이트 후보. 행 수에 비해 값이 클수록 추정이 어긋나기 쉬움

이런 상황에서 사용합니다

  • 같은 쿼리인데 어느 날부터 갑자기 실행 시간이 늘어났다
  • 실행 계획의 추정 행 수와 실제 행 수가 크게 차이난다
  • 대량의 데이터 입력·삭제 직후부터 특정 처리만 느려졌다
  • 통계 자동 업데이트에 맡겨두고 있지만 실제로 언제 업데이트되었는지 알 수 없다

가능한 원인(가능성이 높은 순)

  1. 01

    자동 업데이트 임계값에 도달하지 않음

    AUTO_UPDATE_STATISTICS는 변경된 행 수가 임계값을 초과했을 때 다음으로 해당 개체를 참조하는 시점에 업데이트됩니다. 행 수가 많은 테이블일수록 임계값에 도달하기 어려워, 변경이 누적된 채 오래된 통계로 실행 계획이 만들어지는 경우가 있습니다.

  2. 02

    샘플링 비율이 낮아 분포가 실제와 차이남

    기본 샘플링은 전체 행을 읽지 않습니다. 값의 편차가 큰 열에서는 샘플링 결과로 추정한 행 수가 실제와 차이가 날 수 있습니다.

  3. 03

    통계 자동 업데이트가 비활성화됨

    데이터베이스 옵션인 AUTO_UPDATE_STATISTICS가 OFF이거나, 개별 통계에 NO_RECOMPUTE가 설정되어 있으면 명시적으로 업데이트하기 전까지 오래된 상태로 남습니다.

  4. 04

    정기 유지보수 작업이 실패함

    인덱스 재구축이나 통계 업데이트 작업이 오류로 중단되면, 업데이트 일시가 작업 중단일에서 멈춥니다.

확인 절차

  1. 1

    통계의 최종 업데이트 일시를 목록화한다

    참조만

    위의 참조 전용 SQL을 실행하여 `last_updated`가 오래되었거나 `rows_modified_since_update`가 큰 통계를 찾아냅니다.

  2. 2

    데이터베이스 옵션을 확인한다

    참조만

    `SELECT name, is_auto_update_stats_on, is_auto_create_stats_on, is_auto_update_stats_async_on FROM sys.databases;`로 자동 업데이트 설정을 확인합니다.

  3. 3

    NO_RECOMPUTE가 설정된 통계를 찾는다

    참조만

    `SELECT name FROM sys.stats WHERE no_recompute = 1;`로 자동 업데이트 대상에서 제외된 통계를 확인합니다.

  4. 4

    해당 쿼리의 실행 계획에서 추정 행 수와 실행 시 행 수를 비교한다

    낮음

    실제 실행 계획을 가져와 추정 행 수와 실제 행 수의 차이가 큰 연산자를 찾습니다. 차이가 작다면 원인은 통계가 아닙니다.

대응 방법

즉시 실행 가능한 저위험 대응

  • 업데이트 후보를 특정해 개별적으로 통계를 업데이트

    중간

    `rows_modified_since_update`가 큰 통계만 `UPDATE STATISTICS <table> (<stats>)`로 업데이트합니다. 대상을 좁히면 부하를 줄일 수 있습니다.

  • 자동 업데이트 설정을 확인하고 활성화

    중간

    AUTO_UPDATE_STATISTICS가 OFF라면 변경 영향을 확인한 뒤 활성화를 검토합니다. 설정 변경은 데이터베이스 단위로 적용됩니다.

사전 검토가 필요한 변경

  • 샘플링 비율을 높인다

    중간

    편차가 큰 열은 `WITH FULLSCAN` 또는 `WITH SAMPLE n PERCENT`를 지정합니다. 실행 시간과 I/O가 증가하므로 대상과 시간대를 정한 후 적용합니다.

  • 통계 업데이트를 정기 작업화

    중간

    변경된 행 수를 조건으로 업데이트 대상을 선정하는 작업을 구성하고, 실행 결과의 성공 여부를 모니터링 대상에 포함합니다.

재시작·서비스 영향이 따르는 변경

  • 데이터베이스 전체 통계를 일괄 업데이트

    높음

    `EXEC sp_updatestats;`는 데이터베이스 전체를 대상으로 하므로 I/O와 CPU를 크게 소모하며, 실행 중에는 다른 처리에 영향을 줍니다. 유지보수 시간대 외에는 실시하지 마십시오.

  • 인덱스 재구축으로 통계를 다시 생성

    높음

    인덱스 재구축은 통계를 FULLSCAN에 상응하는 수준으로 업데이트하지만, 잠금과 로그 증가를 수반합니다. ONLINE 옵션 사용 가능 여부는 에디션에 따라 다릅니다.

!주의 사항

  • `sp_updatestats`와 인덱스 전체 재구축은 데이터베이스 전체에 부하를 주는 "대규모 통계 업데이트"에 해당합니다. 실행 시간대와 트랜잭션 로그의 여유 공간을 사전에 확인하십시오.
  • 통계를 업데이트하면 해당 개체를 참조하는 실행 계획이 재컴파일됩니다. 업데이트 직후 일시적으로 CPU 사용률이 상승할 수 있습니다.
  • `WITH FULLSCAN`은 전체 행 스캔입니다. 테라바이트급 테이블에서는 실행 시간이 오래 걸릴 수 있습니다.
  • 추정 행 수와 실제 행 수의 차이가 작다면 지연의 원인은 통계가 아닙니다. 통계 업데이트를 반복해도 개선되지 않습니다.

버전·환경에 따른 차이

SQL Server 2008`sys.dm_db_stats_properties`는 2008 R2 SP2 / 2012 SP1에서 추가되었습니다. 그 이전 환경에서는 `STATS_DATE()`로 업데이트 일시만 가져올 수 있습니다.
Amazon RDS for SQL Server`sys.stats`와 `STATS_DATE()`는 관리형 인스턴스에서도 그대로 사용할 수 있습니다. OS 수준의 작업은 필요하지 않습니다.
SQL Server 2016 이후호환성 수준 130 이후부터는 자동 업데이트 임계값 산출 방식이 변경되어, 큰 테이블에서도 이전보다 더 쉽게 업데이트됩니다.

이것으로 해결되지 않을 때 확인할 사항

  • 실행 계획의 추정 행 수와 실제 행 수를 비교했는지

    차이가 10배 이상인 연산자가 있는지 확인합니다. 차이가 없다면 통계 이외(인덱스 설계, 매개변수 스니핑, 대기 이벤트)를 의심합니다.

  • 대기 이벤트를 확인했는지

    CPU 대기인지 I/O 대기인지 잠금 대기인지에 따라 대응이 달라집니다. CXPACKET이 지배적이라면 병렬 처리 수준 확인으로 넘어갑니다.

  • 매개변수 스니핑의 영향을 확인했는지

    같은 쿼리라도 매개변수 값에 따라 실행 시간이 크게 달라진다면 통계가 아니라 플랜 재사용 문제일 수 있습니다.

  • 유지보수 작업의 실행 이력을 확인했는지

    `msdb.dbo.sysjobhistory`를 참조하여 통계 업데이트 작업이 실패하지 않았는지 확인합니다.

이 문서의 근거와 한계

제품 공식 문서에 기반한 설명

SQL Server의 카탈로그 뷰 `sys.stats`, 함수 `STATS_DATE()`, 동적 관리 함수 `sys.dm_db_stats_properties`의 공개 사양에 기반한 일반적인 확인 절차입니다. 특정 고객 환경의 설정값이나 실측값은 포함하지 않습니다.

자주 묻는 질문

운영 환경에서 실행할 수 있습니까?

참조용 SQL(첫 번째·두 번째 코드 블록)은 데이터와 설정을 변경하지 않으므로 운영 환경에서 실행할 수 있습니다. `UPDATE STATISTICS`를 포함한 세 번째는 변경을 수반하므로, 대상과 시간대를 정한 후 실행하십시오.

AWS RDS에서도 사용할 수 있습니까?

사용할 수 있습니다. `sys.stats`, `STATS_DATE()`, `sys.dm_db_stats_properties` 모두 Amazon RDS for SQL Server에서 사용 가능합니다. OS 수준의 권한은 필요하지 않습니다.

어떤 권한이 필요합니까?

대상 데이터베이스에 대한 연결 권한이 있으면 실행할 수 있습니다. 다만 `sys.stats`는 메타데이터 가시성 규칙을 따르므로, 권한이 없는 개체의 통계는 결과에 나타나지 않습니다. 모든 개체를 보려면 대상 DB에서 충분한 참조 권한을 가진 계정을 사용하십시오.

결과를 어떻게 판단합니까?

`last_updated`가 오래되었다는 것만으로 업데이트할 필요는 없습니다. `rows_modified_since_update`가 행 수에 비해 큰 통계가 우선도가 높은 업데이트 후보입니다. 업데이트 일시가 오래되었어도 데이터가 변경되지 않았다면 통계는 현재 상태로도 적절합니다.

통계를 업데이트하면 느린 쿼리가 반드시 빨라집니까?

아닙니다. 통계 업데이트가 효과가 있는 경우는 추정 행 수와 실제 행 수가 차이가 날 때입니다. 차이가 없다면 인덱스 설계, 대기 이벤트, 병렬 처리 수준 등 다른 요인을 확인하십시오.

이 문서가 다루는 질문

  • SQL Server에서 통계 정보의 최종 업데이트 일시를 확인하고 싶다
  • STATS_DATE 사용법을 알고 싶다
  • 테이블별로 통계가 언제 업데이트되었는지 목록으로 보고 싶다

위험도 표시의 의미

  • 참조만데이터와 설정을 변경하지 않습니다.
  • 낮음영향은 제한적이지만 권한과 부하 확인이 필요합니다.
  • 중간성능·락·비용에 영향을 줄 수 있습니다.
  • 높음장애·데이터 손실·복구 작업이 발생할 수 있습니다.
  • 전문가 검토 필수프로덕션 적용 전 별도 검토가 반드시 필요합니다.

GIIP의 대응 범위

이 확인을 한 번 실행하는 것 자체는 어렵지 않습니다. 하지만 여러 SQL Server나 Aurora MySQL 환경에서 지속적으로 상태를 확인하고, 악화 징후가 나타난 시점에 대응하려면 운영 체계가 필요합니다. GIIP에서는 AWS와 Azure상의 여러 데이터베이스 및 약 30개의 웹 서비스를 AI 에이전트와 인간 전문가가 지속적으로 모니터링합니다. 통계 업데이트 현황처럼 "한 번 보면 알지만 계속 지켜보기 어려운" 항목을 정기 모니터링에 포함시켜, 변화가 생겼을 때만 사람이 판단하는 형태로 운영합니다.

작성·기술 검증

GIIP 프로덕션 운영팀

대규모 웹 서비스, SQL Server, Oracle, AWS, Azure의 설계·마이그레이션·운영에 약 30년간 종사했습니다. x12large급 AWS RDS for SQL Server 환경 12세트, 약 12만 개 테이블 규모의 Oracle 환경, 약 3TB 규모의 TiDB에서 Aurora MySQL로의 마이그레이션 경험이 있습니다. 현재도 다수의 클라우드 데이터베이스와 약 30개의 웹 서비스를 AI 에이전트와 사람 전문가가 지속적으로 모니터링·운영하고 있습니다.

관련 노하우

관련 서비스

SQL Server 성능 문제를 상담하기

동일한 확인을 여러 환경에서 계속해야 한다면, 운영 체계 전체를 상담할 수 있습니다.

SQL Server 성능 문제를 상담하기

← 지식 베이스 목록으로