반응형
반응형

> Link : http://blogs.msdn.com/queryoptteam/archive/2006/07/21/674350.aspx

 

에 유용한 팁이 소개되어 간략히 구현해 보았습니다.

 

SQL Server 2005 온라인 설명서에서 UPDATE STATISTICS 항목을 보면 다음과 같은 부분이 있습니다.

 

 

설명에는 이렇게 나와 있습니다.

 

 

 

결론부터 말하자면, 테이블의 통계 정보를 임의로 설정해 버리는 기능입니다.

 

테이블의 건 수에 따라 처리되는 형태를 확인하고자 할 때, 테스트 데이터를 입력하는 대신 단순히 통계 정보만을 변경하여 실행 계획을 확인해 볼 수 있습니다.

예를 들어, 100,000,000건 데이터가 들어가 있는 테이블에 대한 처리 형태를 테스트해보고자 할 때, 실제로 1억 건의 테스트 데이터를 다 넣는 대신 통계 정보만을 수정해서 테스트 해 본다는 것이지요.

 

 

 

1. 다음과 같은 빈 테이블을 생성합니다.

USE tempdb

GO

 

CREATE TABLE t1(i int, j int)

GO

CREATE TABLE t2(h int, k int)

GO

 

2. 실제 실행 계획을 확인하기 위해 다음과 같은 옵션을 설정합니다.

SET STATISTICS PROFILE ON

GO

 

3. 다음과 같은 두 쿼리에 대한 실행 계획을 확인합니다.

SELECT DISTINCT(i) FROM t1

GO

/*

StmtText

---------------

SELECT DISTINCT(i) FROM t1

  |--Sort(DISTINCT ORDER BY:([tempdb].[dbo].[t1].[i] ASC))

   |--Table Scan(OBJECT:([tempdb].[dbo].[t1]))

*/

 

SELECT * FROM t1, t2 WHERE i = k ORDER BY j + k

GO

/*

StmtText

------------------

SELECT * FROM t1, t2 WHERE i = k ORDER BY j + k

  |--Sort(ORDER BY:([Expr1008] ASC))

       |--Compute Scalar(DEFINE:([Expr1008]=[tempdb] … …

            |--Hash Match(Inner Join, HASH:([tempdb].[dbo].[t2].[k])= … …

                 |--Table Scan(OBJECT:([tempdb].[dbo].[t2]))

                 |--Table Scan(OBJECT:([tempdb].[dbo].[t1]))

*/

 

 

4. , 다음과 같이 t1, t2 테이블에 통계 정보를 강제로 설정합니다.

UPDATE STATISTICS t1 WITH rowcount = 10000, pagecount = 10000

UPDATE STATISTICS t2 WITH rowcount = 100000, pagecount = 100000

GO

 

 

5. 그런 후, 다시 위의 실행 계획을 확인합니다. 이 때 저장된 실행 계획을 재사용하지 않고 새로 생성하도록 하기 위해 쿼리에다가 OPTION (Recompile) 옵션을 추가합니다.

SELECT DISTINCT(i) FROM t1 option (recompile)

GO

/*

StmtText

---------------

SELECT DISTINCT(i) FROM t1 option (recompile)

  |--Hash Match(Aggregate, HASH:([tempdb] … …

       |--Table Scan(OBJECT:([tempdb].[dbo].[t1]))

*/

 

 

 

SELECT * FROM t1, t2 WHERE i = k ORDER BY j + k option (recompile)

GO

/*

StmtText

---------------

SELECT * FROM t1, t2 WHERE i = k ORDER BY j + k option (recompile)

  |--Parallelism(Gather Streams, ORDER BY:([Expr1008] ASC))

       |--Sort(ORDER BY:([Expr1008] ASC))

            |--Compute Scalar(DEFINE:([Expr1008]=[tempdb] … …

                 |--Merge Join(Inner Join, MANY-TO-MANY MERGE:([tempdb] … …

                      |--Sort(ORDER BY:([tempdb].[dbo].[t1].[i] ASC))

                      |    |--Parallelism(Repartition Streams, Hash Partitioning, … …

                      |         |--Table Scan(OBJECT:([tempdb].[dbo].[t1]))

                      |--Sort(ORDER BY:([tempdb].[dbo].[t2].[k] ASC))

                           |--Parallelism(Repartition Streams, Hash Partitioning, … …

                                |--Table Scan(OBJECT:([tempdb].[dbo].[t2]))

*/

 

 

, t1에는 10,000, t2에는 100,000건의 데이터가 있다는 가정으로 실행 계획을 생성하게 됩니다.

반응형
반응형

데이터베이스 옵션 중 IsAutoCreateStatistics 옵션이 활성화되어 있으면 필요한 경우 SQL Server가 자동으로 통계를 만듭니다.

통계는 인덱스가 없거나 인덱스의 첫 번째 키 열이 아닌 단일 컬럼에 대하여 생성하는 정보입니다. 예를 들어 (col1, col2, col3)에 하나의 복합 인덱스(Composite Index)가 만들어져 있다면 col2 또는 col3 에 통계를 만들어 주는 것을 고려할 수 있습니다. 이 때 인덱스의 첫 번째 키 열인 col1 에 대해서는 통계를 만들어 줄 필요가 없습니다. (col1, col2, col3)에 인덱스를 만들어 주면 인덱스의 첫 번째 컬럼인 col1에 대해서는 통계를 자동으로 관리하기 때문입니다.
 
CREATE STATISTICS 문을 사용하면 테이블이나 인덱싱된 뷰의 제공된 열 또는 열 집합에 관한 히스토그램 및 연관된 밀도 그룹(컬렉션)을 수동으로 만들 수 있습니다.

기본적으로 model 데이터베이스의 IsAutoCreateStatistics 옵션이 활성화되어 있으므로 관리자가 아무런 변경을 하지 않았다면 자동 통계 생성이 활성화되어 있을 겁니다.
자동 통계 생성이 활성화되어 있는 데이터베이스의 경우에는 수동으로 통게를 만들 필요는 거의 없습니다. 그러나 자동 통계 생성 옵션을 비활성화한 경우에는 성능 개선을 위하여 통게를 수동으로 만들어 줄 필요가 있을 수 있습니다.

반응형
반응형
SQL Server 2005 관리 강좌.
구성 옵션 등이 잘 정리되어 있어서 읽어볼 만 하다.

이 강좌의 아티클 중 알아두면 좋을만한 Tip 몇개


인덱스 조각화 제거하기
http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005Admin&intSeq=96

통계 업데이트하기
 (음... 모든 통계를 한큐에 업데이트하는 방법도 있었군... 몰랐당.)


추적 - 이벤트와 열

http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005Admin&intSeq=154
(프로필러로 추적할때 설정하는 주요 이벤트에 대한 설명)

(프로필러 에서 SQL:stmtRecompile 이벤트의 EventSubClass 컬럼을 모니터링하여 재컴파일 원인을 분석)


DMV - 재사용이 저조한 실행 계획 찾아내기
http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005Admin&intSeq=231
(컴파일된 SQL Cache 를 보여주는 sys.dm_exec_cached_plans 뷰를 분석하여 usecount가 낮고
           SQL 패턴이 유사한 SQL들을 찾아내는 방법)
반응형

+ Recent posts

반응형