통계(Statistics)

jevida(강성욱) 2015.03.23 17:19 Views : 5884

통계(Statistics)

 

검색 조건이 주어질 때 해당 컬럼으로 구성되는 인덱스를 사용할지 여부를 옵티마이저가 판단의 근거로 활용하는 것이 통계이다.

 

통계는 데이터가 있는 컬럼에 대해 인덱스가 만들어질 때 이 컬럼 값의 히스토그램 및 관련정보를 이용하여 만들어 진다.

 

Sysindex 테이블의 image형식의 statblog컬럼에 통계정보가 저장된다.

SELECT * FROM SYSINDEXES

 

 

데이터베이스 옵션의 auto create statistics와 auto update statistics는 모든 데이터베이스에 대해 자동으로 ture로 설정되며 이 옵션들이 설정되어 있으면 인덱스뿐만 아니라 인덱스가 없는 컬럼에 대해서도 필요할 경우 자동으로 통계가 만들어 지고 일정 비율(전체행의 약20%)의 데이터가 업데이트 되면 통계도 자동으로 업데이트 된다.

 

밀도(density)는 1/(인덱스 키들의 수)로 정의된다. 즉, 성별은 밀도가 0.5(남자, 여자)이지만 나의 주민등록 번호는 1/5000만 이 된다.(대한민국 인구수를 5천만으로 가정 했을 때).

이때 선택도(selectivity)는 주어진 키 값(또는 키 범위)에 해당하는 행수의 정도를 말하는데 행수가 적을수록 선택도가 높다고 한다. 그러나 전체 밀도가 낮더라도 특정 키에 대한 선택도는 낮을 수도 있다.

 

[통계 보기]

DBCC SHOW_STATISTICS문을 사용하여 통계를 확인 할 수 있다. 실습에서는 AdventureWorks의 [Person.Address]테이블을 사용 한다.

 

  • 전체 코드

SELECT * FROM PERSON.ADDRESS

 

EXEC SP_HELPINDEX [PERSON.ADDRESS]

 

DBCC SHOW_STATISTICS([PERSON.ADDRESS], PK_ADDRESS_ADDRESSID)

 

SELECT STATEPROVINCEID, COUNT(*) FROM PERSON.ADDRESS

GROUP BY STATEPROVINCEID

 

DBCC SHOW_STATISTICS([PERSON.ADDRESS], IX_ADDRESS_STATEPROVINCEID)

 

[AdventureWorks] 데이터베이스의 [Person.Address] 테이블의 데이터를 확인 한다. 19614건의 데이터가 들어 있는 것을 확인 할 수 있다.

SELECT * FROM PERSON.ADDRESS

 

 

[Person.Address]의 인덱스 정보를 확인 한다.

EXEC SP_HELPINDEX [PERSON.ADDRESS]

 

 

DBCC SHOW_STATISTICS명령어를 이용하여 클러스터 인덱스 [PK_Address_AddressID]통계 정보를 확인 하자.

-- DBCC SHOW_STATISTICS(테이블명, 인덱스명)

DBCC SHOW_STATISTICS([PERSON.ADDRESS], PK_ADDRESS_ADDRESSID)

 

 

Updated : 최근 통계가 업데이트된 날짜.

Rows : 전체 행 수

Rows Sampled : 샘플링된 행 수 (행 수가 많을 경우 일부를 샘플링하여 사용)

Steps : 히스토그램의 단계 수. 고유 인덱스가 아닐 경우 단계수가 많아지며 최대 200단계 이다.

Average Key length : 컬럼 값의 평균 길이. Int형이므로 4가 표시 된다.

All density : 밀도. 밀도는 Steps의 값과 무관하며 일반적으로 (1/ 인덱스 키들의 수) 이다.

RANGE_HI_KEY : 각 단계(step)에서 샘플링된 최대 값.

RANGE_ROWS : 각 단계에서 RANGE_HI_KEY갑을 제외한 값들의 개수.

EQ_ROWS : 최대값의 개수.

DISTINCT_RANGE_ROWS : RANGE_ROWS 컬럼 값들 중 고유한 값의 개수.

 

 

비클러스터 [IX_Address_StateProvinceID]의 통계정보를 확인 하자. 우선 해당 컬럼의 유니크 ROW가 몇 개인지 확인하자.

SELECT STATEPROVINCEID, COUNT(*) FROM PERSON.ADDRESS

GROUP BY STATEPROVINCEID

 

DBCC SHOW_STATISTICS([PERSON.ADDRESS], IX_ADDRESS_STATEPROVINCEID)

 

STATEPROVINCEID의 유니크한 행수는 74개 이다.

 

통계 정보를 확인 하자.

 

All density의 2개의 정보가 있는 것은 키의 조합이 두 가지이기 때문이다. (인덱스가 사용될 때 StateProvinceID가 사용될 수도 있고, StateProvinceID와 AddressID키 둘다 사용할 수도 있다.)

히스토그램 단계는 StateProvinceID 키가 단독으로 사용될 때의 것이다.(복합키에 대한 히스토그램 정보는 없다.)

 

히스토그램 통계를 이용하여 임의 구간에 대한 키 값을 추정 할 수 있다.

만약 심플링된 행수가 전체 행수와 다르다면 그 비율로 다시 한번 더 계산을 해주어야 한다. 


강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp



No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 20078
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 12120
1634 SSMS 쿼리 자동 줄 바꿈 jevida(강성욱) 2015.03.27 9657
1633 SSMS 인텔리전스 사용 jevida(강성욱) 2015.03.27 6307
1632 SSMS 줄 번호 표시 jevida(강성욱) 2015.03.26 64817
1631 SSMS 시작 옵션 변경하기 jevida(강성욱) 2015.03.26 4355
1630 SSMS 쿼리 결과 다른 탭에 표시하기 jevida(강성욱) 2015.03.26 5197
1629 SSMS 연결 표시줄 색상 변경 jevida(강성욱) 2015.03.26 4868
1628 SSMS 결과 복사시 열 머리글 포함하기 jevida(강성욱) 2015.03.26 4818
1627 SSMS 결과물을 쉼표로 구분하여 출력하기 jevida(강성욱) 2015.03.26 4224
1626 SSMS 최근 사용한 파일에 대한 설정 변경 jevida(강성욱) 2015.03.25 3734
1625 SSMS 상위 행 선택 및 수정 행 변경 jevida(강성욱) 2015.03.25 7194
1624 SSMS에서 변경 스크립트 자동 생성 jevida(강성욱) 2015.03.25 4225
1623 SSMS 명령 단축키 설정 jevida(강성욱) 2015.03.25 6733
1622 Min / Max Server Memory 설정 jevida(강성욱) 2015.03.24 14135
1621 Tempdb 장애 유형과 해결방안.(디스크 공간 및 경로 문제) jevida(강성욱) 2015.03.24 5523
1620 SQL Server ErrorLog에 백업 로그 남지기 않기 jevida(강성욱) 2015.03.24 4101
1619 SQL Server의 Errorlog는 어디에 저장 될까? jevida(강성욱) 2015.03.24 3799
» 통계(Statistics) jevida(강성욱) 2015.03.23 5884
1617 활성 트랜잭션 찾기 jevida(강성욱) 2015.03.23 4084
1616 ForwardedRecord (행 이동에 대한 포워드) jevida(강성욱) 2015.03.23 3435
1615 인덱스 생성 순서에 따른내부 작업 변화 jevida(강성욱) 2015.03.23 5110





XE Login