반응형
반응형

추적과 성능 로그 데이터를 연계 분석하는 방법입니다. 참고하세요.

  1. 추적 데이터를 수집하여 파일 또는 테이블에 저장합니다.

      이 때 StartTime 과 EndTime 컬럼을 포함해야 합니다.

  2. 추적 데이터를 수집하는 동안 동시에 성능 로그 데이터를 수집합니다.

  3. 추적 파일 또는 추적 테이블을 엽니다.

  4. SQL Server 프로파일러 [파일] 메뉴에서 [성능 데이터 가져오기]를 클릭합니다.

  5. [열기] 대화 상자에서 상관 관계를 분석하고자 하는 성능 로그 파일을 선택합니다 .

  6. [성능 카운터 제한 대화 상자 ]에서 추적과 함께 화면에 표시하고자 하는 시스템 모니터 개체와 카운터를

      선택한 다음에 [확인] 버튼을 클릭합니다.

  7. 추적 이벤트 창에서 이벤트를 선택하거나 화살표 키를 사용하여 추적 이벤트 창의 인접 행으로 이동합니다.

     시스템 모니터 데이터 창의 빨간색 세로 막대는 선택한 추적 이벤트와 상관 관계에 있는 성능 로그 데이터를 나타냅니다.

  8. 시스템 모니터 그래프에서 자세히 보고 싶은 시점을 클릭하면, 선택한 시간에 가장 가까운 해당 추적 행이 선택됩니다 .

반응형
반응형

fn_trace_gettable 함수를 사용하면 추적 파일을 SQL Server 프로파일러에서 로드 가능한 테이블로 복사할 있습니다.
추적 파일을 테이블로 복사하면 T-SQL 활용하여 다양한 분석이 가능하므로 편리합니다. 

 

추적 파일을 테이블로 복사하기

SELECT IDENTITY(int, 1, 1) AS SeqNo, * INTO temp_trc

FROM fn_trace_gettable('c:\temp\my_trace.trc', default);

GO

 

반응형
반응형

 

다음에 있는 ekdmadp sp_trace_stop sp_trace_start 실행한 추적(Trace) 중지하는 저장 프로시저입니다.

 

n       추적을 중지하는 저장 프로시저의 예제 스크립트 : sp_trace_stop

USE master

GO

CREATE PROCEDURE sp_trace_stop @TraceName sysname='trace'

AS

SET NOCOUNT ON

 

-- 변수를 선언한다

DECLARE @TraceId int 

DECLARE @TraceFileName sysname

 

-- 추적 목록을 확인하여, 추적을 중지합니다

IF OBJECT_ID('tempdb..TraceQueueList') IS NOT NULL BEGIN

    SELECT @TraceId = TraceID, @TraceFileName=TraceFile

FROM tempdb..TraceQueueList

    WHERE TraceName = @TraceName

 

    IF @@ROWCOUNT<>0 BEGIN

        EXEC sp_trace_setstatus @TraceId, 0

        EXEC sp_trace_setstatus @TraceId, 2

        DELETE tempdb..TraceQueueList

WHERE TraceName = @TraceName

        PRINT 'Trace is stopped. '

+ 'The trace output file name is '+@TraceFileName

    END

    ELSE

        PRINT 'No active traces.'

END

ELSE

    PRINT 'No active traces.'

 

RETURN 0

GO

 

/* 실행하기 */

EXEC sp_trace_stop

GO 

 

반응형
반응형

다음은 추적 스크립팅을 저장 프로시저화한 예제 스크립트입니다. 시스템의 환경에 적합하도록 수정 보완하여 활용하기 바랍니다.

 

n       추적을 시작하는 저장 프로시저의 예제 스크립트 : sp_trace_start

USE master

GO

CREATE PROCEDURE sp_trace_start @TraceFileName sysname=NULL,

@TraceName sysname='trace',

@Options int=2, -- TRACE_FILE_ROLLOVER

@MaxFileSize bigint=5,

@StopTime datetime=NULL,

@Events varchar(300)=

'10,12',

--  10 - RPC:Completed

--  12 - SQL:BatchCompleted

@Cols varchar(300)=

'1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,',

-- 모든 이벤트

@IncludeFilter sysname=NULL,

@ExcludeFilter sysname=NULL

AS

SET NOCOUNT ON

-- 변수 선언

DECLARE @TraceId int

DECLARE @On bit

DECLARE @Rc int

 

SET @On=1

 

-- 이벤트와 이벤트 열을 확인한다.

IF @Events IS NULL or @Cols IS NULL BEGIN

    PRINT 'No Events or Coloumns.'

    RETURN -1

END

 

-- 파일경로와 파일명을 설정한다.

IF @TraceFileName IS NULL

SELECT @TraceFileName = 'C:\Trace\Trace' + CONVERT(CHAR(8),getdate(),112)

 

-- 추적 큐를 만든다

EXEC @Rc =sp_trace_create @TraceId OUT, @Options, @TraceFileName, @MaxFileSize, @StopTime

IF @Rc<>0 BEGIN

    PRINT 'Trace not started.'

    RETURN @Rc

END

PRINT 'Trace started.'

PRINT 'The trace file name is '+@TraceFileName+'.'

 

-- 추적할 이벤트 클래스들과 이벤트 열들을 지정한다

DECLARE @i int, @j int, @Event int, @Col int, @Colstring varchar(300)

 

IF RIGHT(@Events,1)<>',' SET @Events=@Events+','

SET @i=CHARINDEX(',',@Events)

WHILE @i<>0 BEGIN

    SET @Event=CAST(LEFT(@Events,@i-1) AS int)

    SET @Colstring=@Cols

    IF RIGHT(@Colstring,1)<>',' SET @Colstring=@Colstring+','

    SET @j=CHARINDEX(',',@Colstring)

    WHILE @j<>0 BEGIN

        SET @Col=CAST(LEFT(@Colstring,@j-1) AS int)

        EXEC sp_trace_setevent @TraceId, @Event, @Col, @On

        SET @Colstring=SUBSTRING(@Colstring,@j+1 ,300)

        SET @j=CHARINDEX(',',@Colstring)

    END

    SET @Events=SUBSTRING(@Events,@i+1,300)

    SET @i=CHARINDEX(',',@Events)

END

 

-- 필터를 설정한다

EXEC sp_trace_setfilter @TraceId, 10, 0, 7, N'SQL Profiler'

EXEC sp_trace_setfilter @TraceId, 1, 0, 7,  N'EXEC% sp_%trace%'

 

IF @IncludeFilter IS NOT NULL

    EXEC sp_trace_setfilter @TraceId, 1, 0, 6, @IncludeFilter

 

IF @ExcludeFilter IS NOT NULL

    EXEC sp_trace_setfilter @TraceId, 1, 0, 7, @ExcludeFilter

 

-- 추적을 활성화한다

EXEC sp_trace_setstatus @TraceId, 1

 

-- 추적을 기록한다. (테이블 사용)

IF OBJECT_ID('tempdb..TraceQueueList') IS NULL BEGIN

    CREATE TABLE tempdb..TraceQueueList (TraceID int, TraceName varchar(20), TraceFile sysname)

END

 

IF EXISTS(SELECT * FROM tempdb..TraceQueueList WHERE TraceName = @TraceName) BEGIN

    UPDATE tempdb..TraceQueueList

    SET TraceID = @TraceId, TraceFile = @TraceFileName

    WHERE TraceName = @TraceName

END

ELSE BEGIN

    INSERT tempdb..TraceQueueList

VALUES(@TraceId, @TraceName, @TraceFileName)

END

 

RETURN 0

GO

 

/* 실행하기 */

EXEC sp_trace_Start

GO

 

[참고]

?         output 파일을 지정하지 않으면, “C:\Trace” 폴더 밑에 추적 파일이 생성됩니다.

?         스크립트를 직접 실행하려면, “C:\Trace” 폴더를 미리 생성해야 합니다.

?         추적 파일이 커질 수도 있으므로, output 파일이 생성되는 곳의 공간을 충분히 확보합니다.

?         원하는 이벤트와 이벤트 열은 번호로 설정합니다. 이벤트와 이벤트 번호는 온라인 설명서를 참조하십시오.

반응형
반응형

실행 계획을 작성하는 작업은 CPU를 많이 사용하는 작업이기 때문에 새로운 실행 계획을 작성함으로써 얻어지는 이득이 실행 계획 작성에 드는 CPU 비용보다 크다면 재컴파일이 좋지만 그렇지 않은 불필요한 재컴파일은 가능한 한 제거하는 것이 좋습니다. 재컴파일이 발생하면 컴파일된 계획에 잠금을 걸기 때문에 동시성이 저하되므로 성능에 좋지 않은 영향을 미칠 수 있습니다.

실제로 운영 시스템을 모니터링하다 보면 사용자는 알지 못한 채 불필요한 재컴파일이 발생하는 경우가 흔히 있습니다. 그러므로 프로파일러 또는 추적 수집 SP를 사용하여 재컴파일에 대한 모니터링을 수행할 것을 권고합니다.

재컴파일을 모니터링하고자 하는 경우에는 EventSubClass 열을 수집해야 합니다.

다음은 EventSubClas 열의 값에 대한 설명입니다.

EventSubClass

설명

1

스키마 변경으로 인한 재컴파일

2

통계 변경으로 인한 재컴파일

3

지연된 컴파일로 인한 재컴파일

4

SET 옵션 변경으로 인한 재컴파일

5

임시 테이블 변경으로 인한 재컴파일

6

원격 행집합 변경으로 인한 재컴파일

7

FOR BROWSE 권한 변경으로 인한 재컴파일

8

쿼리 통지 환경 변경으로 인한 재컴파일

9

분할된 뷰 변경으로 인한 재컴파일

10

커서 옵션 변경으로 인한 재컴파일

11

OPTION (RECOMPILE) 요청으로 인한 재컴파일




참고로 재컴파일은 주로 다음과 같은 이유로 발생합니다.
- 변경된 행 임계값 (rowmodctr)
- DDL 문
- 스키마 변경
- 임시 테이블 사용
- SET 옵션 사용
   - ANSI_PADDING
   - FORCEPLAN
   - CONCAT_NULL_YIELDS_NULL
   - ANSI_WARNINGS
   - ANSI_NULLS
   - QUOTED_IDENTIFIER
   - ANSI_NULL_DFLT_ON
   - ANSI_NULL_DFLT_OFF

반응형
반응형
프로파일러를 이용하여 추적파일을 만든 경우
추적시에 테이블에 저장하면 서버에 부하가 가해지므로 테이블로 입력하도록 한다.

SELECT IDENTITY(int, 1, 1) AS RowNumber, * INTO [저장할 테이블명]
FROM fn_trace_gettable('C:\추적프로파일러.trc', default);

반응형
반응형

추적 데이터를 수집할 때의 권고 사항입니다.

 

?         불필요한 이벤트의 추가는 삼가합니다. 너무 많은 이벤트의 추가는 서버의 성능에 좋지 않은 영향을 있습니다.

?          일반적인 경우라면, 모든 이벤트 열을 포함시킵니다. 어떤 이벤트들은 보조적인 항목을 반환하는 어떤 항목들에 의존합니다.
적어도 다음 이벤트 열은 포함하는 것이 좋습니다.

-         BinaryData

-         ClientProcessID

-         CPU

-         Duration

-         EndTime

-         EventClass

-         EventSubClass

-         HostName

-         IntegerData

-         LoginName

-         NTUserName

-         Reads

-         SPID

-         StartTime

-         TextData

-         Writes

?         테이블에 추적을 직접 저장하는 것은 성능상 좋지 않습니다. 추적 파일을 생성한 , fn_trace_gettable 함수를 사용하면 테이블에 저장할 있습니다.

 

반응형
반응형

추적을 수집하는 목적에 따라 적절한 추적 이벤트와 이벤트 열의 설정이 필요합니다.

 

?         오래 실행되는 SQL 찾기

오래 실행되는 쿼리는 잘못 튜닝된 시스템, 잘못 작성된 응용 프로그램, 또는 단순히 많은 동작을 수행하는 작업등을 의미할 있습니다. 어떠한 경우건, 이러한 오래 실행되는 SQL 문을 찾아서 튜닝하는 것은 작업의 성능은 물론 전반적인 시스템 성능까지도 향상시킬 있습니다.

권장되는 추적 이벤트 : TSQL, SQL:BatchCompleted

정렬 기준 이벤트 : Duration

 

?         과도한 자원 사용자 찾기

과도한 자원을 사용하는 응용 프로그램이나 사용자를 찾는 추적은 DBA에게 유용한 도구가 있습니다. 이러한 추적 유형은 CPU I/O 자원 모두를 많이 사용하는 SQL 문을 살펴야 합니다. 프로세스나 사용자를 식별하여, 응용 프로그램을 튜닝할 있습니다.

권장되는 추적 이벤트 : TSQL, SQL:BatchCompleted

정렬 기준 이벤트 : CPU, Reads, Writes

 

?         교착 상태 알아내기

사용자의 작업에 따라 교착상태는 시스템에서 문제가 수도 있고 그렇지 않을 수도 있습니다. 많은 경우에 있어 교착 상태는 심각한 문제일 있는데, 경우 원인을 알아내는 것은 성능을 향상시키는데 핵심이 됩니다. 그러나 이러한 이벤트를 프로파일 하는 것은 자원을 많이 사용하게 되므로 주의해야 합니다.

- 권장되는 추적 이벤트

TSQL, SQL:BatchStarting 동작하는 SQL 일괄 처리(batch)

Locks, Lock:Deadlock 교착 상태 자체의 이벤트

Locks, Lock:Deadlock Chain 교착 상태에 이르는 이벤트 순서

            

?         캐시 관리 추적하기

다음과 같은 캐시 관리를 추적할 있습니다.

SP:CacheMiss (이벤트 ID 34)

SP:CacheInsert (이벤트 ID 35)

SP:CacheRemove (이벤트 ID 36)

SP:Recompile (이벤트 ID 37)

SP:CacheHit (이벤트 ID 38)

 

반응형
반응형
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

반응형