[MSSQL] 성능 측정을 위한 Elapsetime 체크 함수

2014. 5. 30. 09:28Coders

오래간만에 MSSQL 관련 포스팅을 합니다.


간혹 가다가, 프로시저나 쿼리의 성능 테스트를 할 때, SSMS 의 예상 실행 게획 표시 등을 이용하기도 하지만, 실제 데이터를 가지고 쿼리를 이리저리 바꿔 가면서 성능 테스트를 할 때가 있습니다.

그런 경우, 데이터가 명확하게 나오는 지가 점검해야 할 1순위이겠지만, 데이터 확인이 다 된 상태에서 그 다음으로 가장 중요한 건 속도 문제겠지요. 이 때, PRINT, GETDATE() 등을 이용하여 시작시간, 종료시간을 기록하고는 합니다. 닷넷 등에는 StopWatch 라는 유용한 클래스가 있어서, 경과 시간에 대한 측정이 용이한데요.(사실, Stopwatch 도 멀티스레드 환경에서는 제대로 된 측정치를 보장하진 않습니다.) SQL 에서는 이러한 기능이 없어 그냥 시간을 보고 시간 차를 계산합니다.


그래서, 간단한 함수를 만들었습니다.

리턴받은 문자열에서 H, M, S 를 다른 문자로 치환(REPLACE 함수)하여 총 경과 시간을 뽑을 수 있는 함수 입니다. (숫자로 받으면 좋겠지만, 그럴 경우 테이블리턴 함수를 써야겠죠.)

또, 이 함수를 응용하면, 시작시간만 파라메터로 받는 함수로 만들어서, 종료 시간은 함수 내부에서 GETDATE() 시스템 함수를 사용하여 측정도 가능하겠습니다.


네, (언제나 그런 거지만) 제가 다음번에 또 써 먹으려고 포스팅 하는 겁니다.

IF OBJECT_ID('DBO.UFN_ELAPSETIME', 'FN') IS NOT NULL
    DROP FUNCTION DBO.UFN_ELAPSETIME;
GO

CREATE FUNCTION DBO.UFN_ELAPSETIME
(
    @DT_START   DATETIME,
    @DT_END     DATETIME
)
RETURNS VARCHAR(100)
AS
BEGIN

  DECLARE @ELAPSE_DT   DATETIME,
          @ELAPSE_TIME VARCHAR(100);

  SET @ELAPSE_DT = @DT_END - @DT_START;
  SET @ELAPSE_TIME =
    CONVERT(VARCHAR, DATEPART(HH, @ELAPSE_DT)) + 'H' +
    RIGHT('0' + CONVERT(VARCHAR, DATEPART(MI, @ELAPSE_DT)), 2) + 'M' +
    RIGHT('0' + CONVERT(VARCHAR, DATEPART(SS, @ELAPSE_DT)), 2) + 'S';

  RETURN @ELAPSE_TIME;
END
GO

-- 테스트
DECLARE @DT_START DATETIME, @DT_END DATETIME;

SET @DT_START = '2014-05-29 21:43:55';
SET @DT_END = GETDATE();

SELECT REPLACE(
       REPLACE(
       REPLACE(
        DBO.UFN_ELAPSETIME(@DT_START, @DT_END),
        'H', '시간'), 'M', '분'), 'S', '초 경과') AS RESULT