반응형

> 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건의 데이터가 있다는 가정으로 실행 계획을 생성하게 됩니다.

반응형

+ Recent posts