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 プロダクション運用チーム

大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。

関連するナレッジ

関連サービス

SQL Server 성능 문제를 상담하기

同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。

SQL Server 성능 문제를 상담하기

ナレッジベース一覧へ