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 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(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 | 최종 업데이트 이후 변경된 행 수 | 값이 큰 행이 업데이트 후보. 행 수에 비해 값이 클수록 추정이 어긋나기 쉬움 |
こういう状況で使います
- 같은 쿼리인데 어느 날부터 갑자기 실행 시간이 늘어났다
- 실행 계획의 추정 행 수와 실제 행 수가 크게 차이난다
- 대량의 데이터 입력·삭제 직후부터 특정 처리만 느려졌다
- 통계 자동 업데이트에 맡겨두고 있지만 실제로 언제 업데이트되었는지 알 수 없다
考えられる原因(可能性の高い順)
01
자동 업데이트 임계값에 도달하지 않음
AUTO_UPDATE_STATISTICS는 변경된 행 수가 임계값을 초과했을 때 다음으로 해당 개체를 참조하는 시점에 업데이트됩니다. 행 수가 많은 테이블일수록 임계값에 도달하기 어려워, 변경이 누적된 채 오래된 통계로 실행 계획이 만들어지는 경우가 있습니다.
02
샘플링 비율이 낮아 분포가 실제와 차이남
기본 샘플링은 전체 행을 읽지 않습니다. 값의 편차가 큰 열에서는 샘플링 결과로 추정한 행 수가 실제와 차이가 날 수 있습니다.
03
통계 자동 업데이트가 비활성화됨
데이터베이스 옵션인 AUTO_UPDATE_STATISTICS가 OFF이거나, 개별 통계에 NO_RECOMPUTE가 설정되어 있으면 명시적으로 업데이트하기 전까지 오래된 상태로 남습니다.
04
정기 유지보수 작업이 실패함
인덱스 재구축이나 통계 업데이트 작업이 오류로 중단되면, 업데이트 일시가 작업 중단일에서 멈춥니다.
確認手順
- 1
통계의 최종 업데이트 일시를 목록화한다
参照のみ위의 참조 전용 SQL을 실행하여 `last_updated`가 오래되었거나 `rows_modified_since_update`가 큰 통계를 찾아냅니다.
- 2
데이터베이스 옵션을 확인한다
参照のみ`SELECT name, is_auto_update_stats_on, is_auto_create_stats_on, is_auto_update_stats_async_on FROM sys.databases;`로 자동 업데이트 설정을 확인합니다.
- 3
NO_RECOMPUTE가 설정된 통계를 찾는다
参照のみ`SELECT name FROM sys.stats WHERE no_recompute = 1;`로 자동 업데이트 대상에서 제외된 통계를 확인합니다.
- 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`은 전체 행 스캔입니다. 테라바이트급 테이블에서는 실행 시간이 오래 걸릴 수 있습니다.
- 추정 행 수와 실제 행 수의 차이가 작다면 지연의 원인은 통계가 아닙니다. 통계 업데이트를 반복해도 개선되지 않습니다.
バージョン・環境による違い
これで解決しない場合に確認すること
실행 계획의 추정 행 수와 실제 행 수를 비교했는지
차이가 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에서 CXPACKET 대기가 많을 때의 원인과 확인 방법
sys.dm_os_wait_stats와 sys.dm_os_waiting_tasks로 CXPACKET을 평가하고, CXCONSUMER와의 구분을 바탕으로 병렬 처리 수준 재검토로 나아가기 위한 절차입니다.
sql-serverSQL Server의 MAXDOP과 Cost Threshold for Parallelism을 확인·변경하는 방법
서버·데이터베이스·쿼리의 3단계에서 병렬 처리 수준을 확인하고 변경하는 절차와, 각각의 적용 범위·영향 범위의 차이를 정리합니다.
sql-serverSQL Server에서 장시간 열려 있는 트랜잭션을 확인하는 SQL
sys.dm_tran_active_transactions 계열 DMV로 시작 시각·세션·마지막 실행 SQL까지 포함하여 방치된 트랜잭션을 특정하는 절차입니다.
関連サービス
SQL Server 성능 문제를 상담하기
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
SQL Server 성능 문제를 상담하기