반응형
반응형

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

반응형
반응형

많은 데이터의 추가, 변경 또는 삭제가 발생하여 인덱스의 키 값 분포가 크게 변경된 경우에는 해당 인덱스의 통계 갱신 즉, UPDATE STATISTICS를 실행하여 데이터베이스 엔진이 적절한 인덱스를 선택하도록 관리하는 작업이 필요합니다.
데이터베이스의 모든 사용자 정의 및 내부 테이블에 대해 UPDATE STATISTICS를 실행하기 위해서는 sp_updatestats를 실행합니다. sp_updatestats는 진행률을 나타내는 메시지를 표시하며, 업데이트가 완료되면 모든 테이블에 대해 통계가 업데이트되었다고 보고합니다. sp_updatestats는 비활성화된 비클러스터형 인덱스에 대한 통계를 업데이트하지만, 비활성화된 클러스터형 인덱스가 있는 테이블은 무시합니다.
명시적 또는 암시적 트랜잭션에서는 UPDATE STATISTICS가 허용되지 않습니다.
통계를 마지막으로 업데이트한 시기는 STATS_DATE 함수를 사용하여 확인 가능합니다

 

통계 업데이트하기

-- HumanResources.Employee 테이블의 모든 인덱스에 대한 통계 업데이트

USE AdventureWorks;

UPDATE STATISTICS HumanResources.Employee;

GO

-- HumanResources.Employee 테이블의 PK_Employee_EmployeeID 인덱스에 대한 통계 업데이트

USE AdventureWorks;

UPDATE STATISTICS HumanResources.Employee PK_Employee_EmployeeID;

GO

-- AdventureWorks 데이터베이스내의 모든 내부 테이블의 통계 업데이터

USE AdventureWorks;

EXEC sp_updatestats

GO

 

반응형

+ Recent posts

반응형