<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%ED%86%B5%EA%B3%84%EC%A0%95%EB%B3%B4_%EA%B0%B1%EC%8B%A0</id>
	<title>통계정보 갱신 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%ED%86%B5%EA%B3%84%EC%A0%95%EB%B3%B4_%EA%B0%B1%EC%8B%A0"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%86%B5%EA%B3%84%EC%A0%95%EB%B3%B4_%EA%B0%B1%EC%8B%A0&amp;action=history"/>
	<updated>2026-09-10T11:54:56Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%86%B5%EA%B3%84%EC%A0%95%EB%B3%B4_%EA%B0%B1%EC%8B%A0&amp;diff=1805&amp;oldid=prev</id>
		<title>Dbstudy: 새 문서: == 통계정보 == * SQL Server에서 **테이블/인덱스 통계정보**를 확인하려면 Oracle의 `DBA_TAB_STATISTICS`, `DBA_IND_STATISTICS`, `DBA_TAB_COL_STATISTICS`와 대응해서 보면 이해하기 좋습니다. * 가장 중요한 것은 SQL Server의 **통계 객체(Statistics)** 자체를 조회하는 것입니다.  === 특정 테이블의 통계정보 ===  예를 들어 `dbo.ORDERS` 테이블:  &lt;source lang=sql&gt; SELECT     s.name AS schema_name,     t.name AS table...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%86%B5%EA%B3%84%EC%A0%95%EB%B3%B4_%EA%B0%B1%EC%8B%A0&amp;diff=1805&amp;oldid=prev"/>
		<updated>2026-09-09T13:51:17Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == 통계정보 == * SQL Server에서 **테이블/인덱스 통계정보**를 확인하려면 Oracle의 `DBA_TAB_STATISTICS`, `DBA_IND_STATISTICS`, `DBA_TAB_COL_STATISTICS`와 대응해서 보면 이해하기 좋습니다. * 가장 중요한 것은 SQL Server의 **통계 객체(Statistics)** 자체를 조회하는 것입니다.  === 특정 테이블의 통계정보 ===  예를 들어 `dbo.ORDERS` 테이블:  &amp;lt;source lang=sql&amp;gt; SELECT     s.name AS schema_name,     t.name AS table...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 통계정보 ==&lt;br /&gt;
* SQL Server에서 **테이블/인덱스 통계정보**를 확인하려면 Oracle의 `DBA_TAB_STATISTICS`, `DBA_IND_STATISTICS`, `DBA_TAB_COL_STATISTICS`와 대응해서 보면 이해하기 좋습니다.&lt;br /&gt;
* 가장 중요한 것은 SQL Server의 **통계 객체(Statistics)** 자체를 조회하는 것입니다.&lt;br /&gt;
&lt;br /&gt;
=== 특정 테이블의 통계정보 ===&lt;br /&gt;
&lt;br /&gt;
예를 들어 `dbo.ORDERS` 테이블:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
    s.name AS schema_name,&lt;br /&gt;
    t.name AS table_name,&lt;br /&gt;
    st.name AS statistics_name,&lt;br /&gt;
    st.stats_id,&lt;br /&gt;
&lt;br /&gt;
    st.auto_created,&lt;br /&gt;
    st.user_created,&lt;br /&gt;
    st.no_recompute,&lt;br /&gt;
&lt;br /&gt;
    sp.last_updated,&lt;br /&gt;
    sp.rows,&lt;br /&gt;
    sp.rows_sampled,&lt;br /&gt;
    sp.modification_counter,&lt;br /&gt;
&lt;br /&gt;
    sp.steps,&lt;br /&gt;
&lt;br /&gt;
    CAST(&lt;br /&gt;
        sp.rows_sampled * 100.0&lt;br /&gt;
        / NULLIF(sp.rows, 0)&lt;br /&gt;
        AS DECIMAL(10,2)&lt;br /&gt;
    ) AS sample_pct&lt;br /&gt;
&lt;br /&gt;
FROM sys.tables t&lt;br /&gt;
JOIN sys.schemas s&lt;br /&gt;
    ON t.schema_id = s.schema_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.stats st&lt;br /&gt;
    ON t.object_id = st.object_id&lt;br /&gt;
&lt;br /&gt;
OUTER APPLY sys.dm_db_stats_properties(&lt;br /&gt;
    st.object_id,&lt;br /&gt;
    st.stats_id&lt;br /&gt;
) sp&lt;br /&gt;
&lt;br /&gt;
WHERE&lt;br /&gt;
    s.name = &amp;#039;dbo&amp;#039;&lt;br /&gt;
    AND t.name = &amp;#039;ORDERS&amp;#039;&lt;br /&gt;
&lt;br /&gt;
ORDER BY&lt;br /&gt;
    st.stats_id;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
결과는 대략:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
schema  table   statistics_name          last_updated       rows       sampled    mod_count&lt;br /&gt;
&lt;br /&gt;
dbo     ORDERS  _WA_Sys_00000001_...     2026-09-09 20:30   50,000,000  5,000,000   250,000&lt;br /&gt;
dbo     ORDERS  IX_ORDERS_CUSTOMER       2026-09-09 20:31   50,000,000  50,000,000    2,500&lt;br /&gt;
dbo     ORDERS  IX_ORDERS_DATE           2026-09-08 09:10   49,000,000  4,900,000   800,000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
에서 특히 중요하게 볼 것은:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
last_updated&lt;br /&gt;
rows&lt;br /&gt;
rows_sampled&lt;br /&gt;
modification_counter&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
입니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 2. Oracle `DBA_TAB_STATISTICS`와 비슷하게 보기&lt;br /&gt;
&lt;br /&gt;
테이블별 통계 업데이트 상태를 보고 싶다면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
    s.name AS schema_name,&lt;br /&gt;
    t.name AS table_name,&lt;br /&gt;
&lt;br /&gt;
    sp.last_updated,&lt;br /&gt;
    sp.rows,&lt;br /&gt;
    sp.rows_sampled,&lt;br /&gt;
    sp.modification_counter,&lt;br /&gt;
&lt;br /&gt;
    CAST(&lt;br /&gt;
        sp.modification_counter * 100.0&lt;br /&gt;
        / NULLIF(sp.rows, 0)&lt;br /&gt;
        AS DECIMAL(10,2)&lt;br /&gt;
    ) AS modification_pct&lt;br /&gt;
&lt;br /&gt;
FROM sys.tables t&lt;br /&gt;
JOIN sys.schemas s&lt;br /&gt;
    ON t.schema_id = s.schema_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.stats st&lt;br /&gt;
    ON t.object_id = st.object_id&lt;br /&gt;
&lt;br /&gt;
OUTER APPLY sys.dm_db_stats_properties(&lt;br /&gt;
    st.object_id,&lt;br /&gt;
    st.stats_id&lt;br /&gt;
) sp&lt;br /&gt;
&lt;br /&gt;
WHERE t.is_ms_shipped = 0&lt;br /&gt;
&lt;br /&gt;
ORDER BY&lt;br /&gt;
    sp.modification_counter DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예를 들어:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
TABLE          ROWS         MODIFICATION_COUNTER   MODIFICATION_%&lt;br /&gt;
-----------------  --------------  ----------------------------  --------------------&lt;br /&gt;
ORDERS         50,000,000          5,000,000              10.00&lt;br /&gt;
CUSTOMER        8,000,000          1,200,000              15.00&lt;br /&gt;
PRODUCT         2,000,000             5,000               0.25&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이런 결과가 나온다면 `ORDERS`, `CUSTOMER`부터 통계를 점검하는 것이 좋습니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 3. 인덱스별 통계정보&lt;br /&gt;
&lt;br /&gt;
SQL Server에서는 **인덱스에 연결된 통계**와 일반 column statistics가 존재합니다.&lt;br /&gt;
&lt;br /&gt;
인덱스 목록과 해당 통계를 같이 보고 싶다면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
    s.name AS schema_name,&lt;br /&gt;
    t.name AS table_name,&lt;br /&gt;
&lt;br /&gt;
    i.name AS index_name,&lt;br /&gt;
    i.index_id,&lt;br /&gt;
    i.type_desc AS index_type,&lt;br /&gt;
&lt;br /&gt;
    st.name AS statistics_name,&lt;br /&gt;
&lt;br /&gt;
    st.auto_created,&lt;br /&gt;
    st.user_created,&lt;br /&gt;
    st.no_recompute,&lt;br /&gt;
&lt;br /&gt;
    sp.last_updated,&lt;br /&gt;
    sp.rows,&lt;br /&gt;
    sp.rows_sampled,&lt;br /&gt;
    sp.modification_counter&lt;br /&gt;
&lt;br /&gt;
FROM sys.tables t&lt;br /&gt;
&lt;br /&gt;
JOIN sys.schemas s&lt;br /&gt;
    ON t.schema_id = s.schema_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.indexes i&lt;br /&gt;
    ON t.object_id = i.object_id&lt;br /&gt;
&lt;br /&gt;
LEFT JOIN sys.stats st&lt;br /&gt;
    ON t.object_id = st.object_id&lt;br /&gt;
   AND st.name = i.name&lt;br /&gt;
&lt;br /&gt;
OUTER APPLY sys.dm_db_stats_properties(&lt;br /&gt;
    st.object_id,&lt;br /&gt;
    st.stats_id&lt;br /&gt;
) sp&lt;br /&gt;
&lt;br /&gt;
WHERE&lt;br /&gt;
    t.is_ms_shipped = 0&lt;br /&gt;
    AND i.index_id &amp;gt; 0&lt;br /&gt;
&lt;br /&gt;
ORDER BY&lt;br /&gt;
    s.name,&lt;br /&gt;
    t.name,&lt;br /&gt;
    i.index_id;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
그런데 여기서 중요한 점이 있습니다.&lt;br /&gt;
&lt;br /&gt;
**모든 인덱스 통계가 단순히 `statistics_name = index_name` 형태라고 가정하면 안 됩니다.**&lt;br /&gt;
&lt;br /&gt;
따라서 실제 인덱스와 통계를 정확하게 연결하려면 `sys.stats`와 `sys.index_columns`까지 보는 것이 좋습니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 4. 인덱스 + 통계의 선두 컬럼까지 확인&lt;br /&gt;
&lt;br /&gt;
튜닝할 때는 이 쿼리를 추천합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
    s.name AS schema_name,&lt;br /&gt;
    t.name AS table_name,&lt;br /&gt;
&lt;br /&gt;
    i.name AS index_name,&lt;br /&gt;
    i.index_id,&lt;br /&gt;
    i.type_desc,&lt;br /&gt;
&lt;br /&gt;
    st.name AS statistics_name,&lt;br /&gt;
&lt;br /&gt;
    STATS_DATE(&lt;br /&gt;
        st.object_id,&lt;br /&gt;
        st.stats_id&lt;br /&gt;
    ) AS stats_date,&lt;br /&gt;
&lt;br /&gt;
    sp.rows,&lt;br /&gt;
    sp.rows_sampled,&lt;br /&gt;
    sp.modification_counter,&lt;br /&gt;
&lt;br /&gt;
    STRING_AGG(&lt;br /&gt;
        CASE&lt;br /&gt;
            WHEN ic.is_included_column = 0&lt;br /&gt;
            THEN c.name&lt;br /&gt;
        END,&lt;br /&gt;
        &amp;#039;, &amp;#039;&lt;br /&gt;
    ) WITHIN GROUP&lt;br /&gt;
    (&lt;br /&gt;
        ORDER BY ic.key_ordinal&lt;br /&gt;
    ) AS key_columns,&lt;br /&gt;
&lt;br /&gt;
    STRING_AGG(&lt;br /&gt;
        CASE&lt;br /&gt;
            WHEN ic.is_included_column = 1&lt;br /&gt;
            THEN c.name&lt;br /&gt;
        END,&lt;br /&gt;
        &amp;#039;, &amp;#039;&lt;br /&gt;
    ) AS include_columns&lt;br /&gt;
&lt;br /&gt;
FROM sys.tables t&lt;br /&gt;
&lt;br /&gt;
JOIN sys.schemas s&lt;br /&gt;
    ON t.schema_id = s.schema_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.indexes i&lt;br /&gt;
    ON t.object_id = i.object_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.stats st&lt;br /&gt;
    ON t.object_id = st.object_id&lt;br /&gt;
   AND st.name = i.name&lt;br /&gt;
&lt;br /&gt;
JOIN sys.index_columns ic&lt;br /&gt;
    ON i.object_id = ic.object_id&lt;br /&gt;
   AND i.index_id = ic.index_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.columns c&lt;br /&gt;
    ON ic.object_id = c.object_id&lt;br /&gt;
   AND ic.column_id = c.column_id&lt;br /&gt;
&lt;br /&gt;
OUTER APPLY sys.dm_db_stats_properties(&lt;br /&gt;
    st.object_id,&lt;br /&gt;
    st.stats_id&lt;br /&gt;
) sp&lt;br /&gt;
&lt;br /&gt;
WHERE&lt;br /&gt;
    t.is_ms_shipped = 0&lt;br /&gt;
&lt;br /&gt;
GROUP BY&lt;br /&gt;
    s.name,&lt;br /&gt;
    t.name,&lt;br /&gt;
    i.name,&lt;br /&gt;
    i.index_id,&lt;br /&gt;
    i.type_desc,&lt;br /&gt;
    st.name,&lt;br /&gt;
    st.object_id,&lt;br /&gt;
    st.stats_id,&lt;br /&gt;
    sp.rows,&lt;br /&gt;
    sp.rows_sampled,&lt;br /&gt;
    sp.modification_counter&lt;br /&gt;
&lt;br /&gt;
ORDER BY&lt;br /&gt;
    s.name,&lt;br /&gt;
    t.name,&lt;br /&gt;
    i.index_id;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이렇게 보면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
TABLE       INDEX                KEY_COLUMNS              INCLUDE       LAST_UPDATE     MOD&lt;br /&gt;
-------------  -------------------------  ------------------------------  ----------------  ------------------  -----&lt;br /&gt;
ORDERS      PK_ORDERS            ORDER_ID                 NULL          2026-09-09      100&lt;br /&gt;
ORDERS      IX_ORDERS_CUSTOMER   CUSTOMER_ID, ORDER_DATE  AMOUNT        2026-09-09   120000&lt;br /&gt;
ORDERS      IX_ORDERS_STATUS     STATUS, ORDER_DATE       AMOUNT        2026-08-20   900000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
처럼 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 5. 가장 중요한 것: Histogram 확인&lt;br /&gt;
&lt;br /&gt;
Oracle DBA가 SQL Server 통계를 튜닝하려면 **Histogram을 반드시 보시는 것을 추천**합니다.&lt;br /&gt;
&lt;br /&gt;
SQL Server에서는:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DBCC SHOW_STATISTICS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
를 사용합니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DBCC SHOW_STATISTICS&lt;br /&gt;
(&lt;br /&gt;
    &amp;#039;dbo.ORDERS&amp;#039;,&lt;br /&gt;
    &amp;#039;IX_ORDERS_CUSTOMER&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
하면 크게 3개가 나옵니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
1. STAT_HEADER&lt;br /&gt;
2. DENSITY_VECTOR&lt;br /&gt;
3. HISTOGRAM&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이건 Oracle의:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
DBA_TAB_HISTOGRAMS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
를 보는 것과 가장 비슷한 부분입니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 6. Histogram만 보고 싶다면&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
DBCC SHOW_STATISTICS&lt;br /&gt;
(&lt;br /&gt;
    &amp;#039;dbo.ORDERS&amp;#039;,&lt;br /&gt;
    &amp;#039;IX_ORDERS_CUSTOMER&amp;#039;&lt;br /&gt;
)&lt;br /&gt;
WITH HISTOGRAM;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
결과 예:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
RANGE_HI_KEY    EQ_ROWS    DISTINCT_RANGE_ROWS    AVG_RANGE_ROWS&lt;br /&gt;
-----------------  ------------  ----------------------------  ------------------&lt;br /&gt;
100               5000           0                    1&lt;br /&gt;
200              12000          50                  120&lt;br /&gt;
300             500000        1000                  500&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 정보가 **Cardinality Estimation**을 볼 때 매우 중요합니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 7. 통계가 오래되었는지 Top으로 확인&lt;br /&gt;
&lt;br /&gt;
운영 DB에서 제가 특히 추천하는 쿼리입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT TOP (50)&lt;br /&gt;
&lt;br /&gt;
    s.name AS schema_name,&lt;br /&gt;
    t.name AS table_name,&lt;br /&gt;
&lt;br /&gt;
    st.name AS statistics_name,&lt;br /&gt;
&lt;br /&gt;
    sp.last_updated,&lt;br /&gt;
&lt;br /&gt;
    sp.rows,&lt;br /&gt;
    sp.rows_sampled,&lt;br /&gt;
&lt;br /&gt;
    sp.modification_counter,&lt;br /&gt;
&lt;br /&gt;
    CAST(&lt;br /&gt;
        sp.modification_counter * 100.0&lt;br /&gt;
        / NULLIF(sp.rows, 0)&lt;br /&gt;
        AS DECIMAL(10,2)&lt;br /&gt;
    ) AS modification_pct,&lt;br /&gt;
&lt;br /&gt;
    st.auto_created,&lt;br /&gt;
    st.user_created,&lt;br /&gt;
    st.no_recompute&lt;br /&gt;
&lt;br /&gt;
FROM sys.tables t&lt;br /&gt;
&lt;br /&gt;
JOIN sys.schemas s&lt;br /&gt;
    ON t.schema_id = s.schema_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.stats st&lt;br /&gt;
    ON t.object_id = st.object_id&lt;br /&gt;
&lt;br /&gt;
OUTER APPLY sys.dm_db_stats_properties(&lt;br /&gt;
    st.object_id,&lt;br /&gt;
    st.stats_id&lt;br /&gt;
) sp&lt;br /&gt;
&lt;br /&gt;
WHERE&lt;br /&gt;
    t.is_ms_shipped = 0&lt;br /&gt;
&lt;br /&gt;
ORDER BY&lt;br /&gt;
    modification_pct DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
TABLE       STATISTICS              ROWS       MODIFICATION   MOD%&lt;br /&gt;
-------------  -----------------------------  ------------  ----------------   ------&lt;br /&gt;
ORDERS      IX_ORDERS_CUSTOMER      50,000,000    5,000,000   10.00&lt;br /&gt;
CUSTOMER    IX_CUSTOMER_REGION       8,000,000    700,000     8.75&lt;br /&gt;
SALES       IX_SALES_DATE           100,000,000  4,000,000    4.00&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이렇게 나오면 **통계가 stale일 가능성이 높은 객체**부터 조사할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 8. 통계 업데이트 여부를 판단할 때 주의&lt;br /&gt;
&lt;br /&gt;
`modification_counter`가 크다고 무조건 통계가 잘못된 것은 아닙니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rows = 100,000,000&lt;br /&gt;
modification_counter = 100,000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
변경률 = 0.1%&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
밖에 안 됩니다.&lt;br /&gt;
&lt;br /&gt;
반면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
rows = 1,000,000&lt;br /&gt;
modification_counter = 300,000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
변경률 = 30%&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
입니다.&lt;br /&gt;
&lt;br /&gt;
따라서 저는:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
last_updated&lt;br /&gt;
+&lt;br /&gt;
rows&lt;br /&gt;
+&lt;br /&gt;
modification_counter&lt;br /&gt;
+&lt;br /&gt;
Histogram&lt;br /&gt;
+&lt;br /&gt;
실행계획의 Estimated Rows / Actual Rows&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
를 같이 봅니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 9. 자동 통계인지 확인&lt;br /&gt;
&lt;br /&gt;
`sys.stats`에서는 다음을 확인할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
    s.name AS schema_name,&lt;br /&gt;
    t.name AS table_name,&lt;br /&gt;
    st.name AS statistics_name,&lt;br /&gt;
&lt;br /&gt;
    st.auto_created,&lt;br /&gt;
    st.user_created,&lt;br /&gt;
    st.no_recompute,&lt;br /&gt;
&lt;br /&gt;
    STATS_DATE(&lt;br /&gt;
        st.object_id,&lt;br /&gt;
        st.stats_id&lt;br /&gt;
    ) AS last_updated&lt;br /&gt;
&lt;br /&gt;
FROM sys.tables t&lt;br /&gt;
JOIN sys.schemas s&lt;br /&gt;
    ON t.schema_id = s.schema_id&lt;br /&gt;
JOIN sys.stats st&lt;br /&gt;
    ON t.object_id = st.object_id&lt;br /&gt;
&lt;br /&gt;
WHERE t.is_ms_shipped = 0&lt;br /&gt;
&lt;br /&gt;
ORDER BY&lt;br /&gt;
    s.name,&lt;br /&gt;
    t.name,&lt;br /&gt;
    st.stats_id;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
여기서:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
auto_created = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이면 SQL Server가 자동 생성한 통계이고,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
user_created = 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이면 사용자가 만든 통계입니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 10. 통계의 실제 컬럼 확인&lt;br /&gt;
&lt;br /&gt;
어떤 통계가 **어떤 컬럼을 대상으로 만들어졌는지** 확인하려면:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
    s.name AS schema_name,&lt;br /&gt;
    t.name AS table_name,&lt;br /&gt;
&lt;br /&gt;
    st.name AS statistics_name,&lt;br /&gt;
&lt;br /&gt;
    sc.stats_column_id,&lt;br /&gt;
    c.name AS column_name,&lt;br /&gt;
&lt;br /&gt;
    sc.stats_column_id&lt;br /&gt;
&lt;br /&gt;
FROM sys.stats st&lt;br /&gt;
&lt;br /&gt;
JOIN sys.tables t&lt;br /&gt;
    ON st.object_id = t.object_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.schemas s&lt;br /&gt;
    ON t.schema_id = s.schema_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.stats_columns sc&lt;br /&gt;
    ON st.object_id = sc.object_id&lt;br /&gt;
   AND st.stats_id = sc.stats_id&lt;br /&gt;
&lt;br /&gt;
JOIN sys.columns c&lt;br /&gt;
    ON sc.object_id = c.object_id&lt;br /&gt;
   AND sc.column_id = c.column_id&lt;br /&gt;
&lt;br /&gt;
WHERE&lt;br /&gt;
    t.is_ms_shipped = 0&lt;br /&gt;
&lt;br /&gt;
ORDER BY&lt;br /&gt;
    s.name,&lt;br /&gt;
    t.name,&lt;br /&gt;
    st.name,&lt;br /&gt;
    sc.stats_column_id;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
예:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
TABLE    STATISTICS                 COLUMN&lt;br /&gt;
---------  ---------------------------------  ----------------&lt;br /&gt;
ORDERS   IX_ORDERS_CUSTOMER         CUSTOMER_ID&lt;br /&gt;
ORDERS   IX_ORDERS_CUSTOMER         ORDER_DATE&lt;br /&gt;
ORDERS   _WA_Sys_...                STATUS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이걸 보면 **인덱스 통계와 Auto Created Statistics를 구분**하기 좋습니다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 11. Oracle DBA 관점에서 대응시키면&lt;br /&gt;
&lt;br /&gt;
대략 이렇게 생각하시면 됩니다.&lt;br /&gt;
&lt;br /&gt;
| Oracle                   | SQL Server                                |&lt;br /&gt;
| -------------------------------- | ------------------------------------------------------ |&lt;br /&gt;
| `DBA_TAB_STATISTICS`     | `sys.stats` + `dm_db_stats_properties()`  |&lt;br /&gt;
| `DBA_IND_STATISTICS`     | `sys.stats` + `sys.indexes`               |&lt;br /&gt;
| `DBA_TAB_COL_STATISTICS` | `sys.stats_columns`                       |&lt;br /&gt;
| `DBA_TAB_HISTOGRAMS`     | `DBCC SHOW_STATISTICS ... WITH HISTOGRAM` |&lt;br /&gt;
| `NUM_ROWS`               | `rows`                                    |&lt;br /&gt;
| `SAMPLE_SIZE`            | `rows_sampled`                            |&lt;br /&gt;
| `LAST_ANALYZED`          | `last_updated`                            |&lt;br /&gt;
| 변경량                      | `modification_counter`                    |&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
## 실전에서 특히 유용한 조합&lt;br /&gt;
&lt;br /&gt;
지금까지 질문하신 **SQL 튜닝 + 파티션 + 테이블/인덱스 사이즈**까지 연결해서 보면, 저는 문제 SQL 하나를 잡은 다음 아래 순서로 확인하는 것을 추천합니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
① Actual Execution Plan&lt;br /&gt;
        ↓&lt;br /&gt;
② Estimated Rows vs Actual Rows&lt;br /&gt;
        ↓&lt;br /&gt;
③ 해당 테이블/인덱스 Statistics&lt;br /&gt;
        ↓&lt;br /&gt;
④ last_updated&lt;br /&gt;
        ↓&lt;br /&gt;
⑤ modification_counter&lt;br /&gt;
        ↓&lt;br /&gt;
⑥ DBCC SHOW_STATISTICS → Histogram&lt;br /&gt;
        ↓&lt;br /&gt;
⑦ Logical Reads&lt;br /&gt;
        ↓&lt;br /&gt;
⑧ Index / Query 수정&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
특히 **`Estimated Rows`와 `Actual Rows`가 크게 차이 나는 SQL**이라면 통계정보가 문제의 원인인지 먼저 확인할 가치가 큽니다.&lt;br /&gt;
&lt;br /&gt;
예를 들어 실행계획이:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Estimated Rows = 10&lt;br /&gt;
Actual Rows    = 2,500,000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이면 단순히 인덱스가 없다는 문제만 볼 것이 아니라 **통계의 `last_updated`, `modification_counter`, histogram**을 같이 확인해야 합니다.&lt;br /&gt;
&lt;br /&gt;
또 **파티션 테이블**이라면 일반 테이블보다 한 단계 더 들어가서 **파티션별 통계와 Incremental Statistics 여부**까지 보는 것이 중요합니다. SQL Server의 파티션 테이블을 튜닝 중이시라면 이 부분을 별도로 확인하는 쿼리까지 붙여서 보는 것이 좋습니다.&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
</feed>