t-sql 쿼리를 실행하는 데 걸리는 시간 측정


156

SqlServer 2005를 사용하는 두 개의 t-sql 쿼리가 있습니다. 각 쿼리를 실행하는 데 걸리는 시간을 어떻게 측정 할 수 있습니까?

스톱워치를 사용해도 잘리지 않습니다.


2
Sql Server Management Studio를 사용하고 있습니까? 일반적으로 두 번째 해상도로만 각 쿼리에 대해 경과 된 시간을 표시합니다. 또한이 관련 질문을 참조하십시오 : stackoverflow.com/questions/8247587/…
mellamokb

답변:


174

이벤트 간 "경과 시간"을 측정하는 간단한 방법 중 하나는 현재 날짜와 시간을 파악하는 것입니다.

SQL Server Management Studio에서

SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ; 
SELECT GETDATE(); 

경과 시간을 계산하기 위해 해당 날짜 값을 변수로 가져 와서 DATEDIFF 함수를 사용할 수 있습니다.

DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;

SET @t1 = GETDATE();
SELECT /* query one */ 1 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

SET @t1 = GETDATE();
SELECT /* query two */ 2 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

그것은 하나의 접근 방식입니다. SQL 프로파일 러를 사용하여 쿼리의 경과 시간을 얻을 수도 있습니다.


이 작업을 수행하는 방법에 대해 Sql Profiler 문서를 찾았지만 몇 시간 동안 읽을 필요가없는 문서를 찾을 수 없습니다. "Profiler for Dummies"링크를 추천 할 수 있습니까?
TheMoot

@TheMoot 내가 늦었다는 것을 알고 있지만 MSDN 링크는 "[Subject] for Dummies"요구에 완벽합니다. :). 이 방법을
John Odom

다른 사람이 SQL Management Studio에서 이것을 사용하는 데 문제가 있습니까? 테스트를 위해 저장 프로 시저에서 약 15 개의 쿼리 세트에 추가했으며 실행하는 데 너무 오래 걸립니다. 나는 7 분에 취소했고 모든 타이머는 약 2 분 밖에 걸리지 않았습니다. 따라서 반환 텍스트 캐시 문제가 있거나 너무 많은 날짜 차이를 계산하는 데 너무 오래 걸릴 것으로 생각합니다.
MH

2
@Hanoncs : GETDATE ()를 평가하고 결과를 변수에 할당하는 데 약간의 시간이 있고 DATEDIFF ()를 평가하고 결과를 반환하는 데 약간의 시간이 있습니다. 내가 제안한 단순한 접근 방식은 싱글 톤 쿼리에 대한 대략적인 측정을 얻는 것입니다. 저장 프로 시저의 단단한 루프 내 에서이 방법을 사용하지 않는 것이 좋습니다. 저장 프로 시저에 일련의 쿼리가있는 경우이 접근 방식을 사용하여 신중한 지점에서 디버깅 출력을 추가하고 판별 기 열을 추가하여 프로 시저에서 어떤 라인이 어떤 결과를 생성했는지 알 수 있습니다.
spencer7593

1
나는 보통 SET @t1 = GETDATE();쿼리 상단에 SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();붙인 다음 쿼리 내 적절한 지점에 붙여 넣 습니다 ( "NOTE 1"을 적절하게 작성). 선택을 측정 값 대신 중단 점으로 처리하는 것은 의미 적으로 접근 방식과 동일하지만 @ t1에 대한 최종 설정은 의사가 있지만 모든 쿼리를 측정해야한다고 가정합니다. 이는 순전히 정신 / 타이핑 최적화입니다 (쿼리 당 두 개의 페이스트가 아닌 중단 점당 하나의 페이스트).
Brian

251

위의 답변보다 더 정확한 측정을 원할 경우 :

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

결과는 메시지 창에 나타납니다.

업데이트 (2015-07-29) :

널리 사용되는 요청에 따라 구성 요소가 아닌 전체 저장 프로 시저 실행 시간을 정하는 데 사용할 수있는 코드 스 니펫을 작성했습니다. 마지막 실행에 걸린 시간 만 반환하지만 그에 의해 반환되는 추가 통계 sys.dm_exec_procedure_stats도 있습니다.

-- Use the last_elapsed_time from sys.dm_exec_procedure_stats
-- to time an entire stored procedure.

-- Set the following variables to the name of the stored proc
-- for which which you would like run duration info
DECLARE @DbName NVARCHAR(128);
DECLARE @SchemaName SYSNAME;
DECLARE @ProcName SYSNAME=N'TestProc';

SELECT CONVERT(TIME(3),DATEADD(ms,ROUND(last_elapsed_time/1000.0,0),0)) 
       AS LastExecutionTime
FROM sys.dm_exec_procedure_stats
WHERE OBJECT_NAME(object_id,database_id)=@ProcName AND
      (OBJECT_SCHEMA_NAME(object_id,database_id)=@SchemaName OR @SchemaName IS NULL) AND
      (DB_NAME(database_id)=@DbName OR @DbName IS NULL)

2
데이터베이스에 대한 액세스 권한이 읽기 전용 인 경우이 기능을 사용할 수 없습니다. To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. from : technet.microsoft.com/en-us/library/ms190287.aspx
Rob

5
저장 프로 시저를 실행해야하는 전체 시간을 볼 수있는 방법이 있습니까? 지금은 많은 단일 측정을 볼 수 있습니다.
Rookian

2
@Rookian, 나는 당신을 돕기 위해 몇 가지 코드를 답변에 추가했습니다.
Michael Goldshteyn

17
DECLARE @StartTime datetime
DECLARE @EndTime datetime
SELECT @StartTime=GETDATE() 

 -- Write Your Query


SELECT @EndTime=GETDATE()

--This will return execution time of your query
SELECT DATEDIFF(MS,@StartTime,@EndTime) AS [Duration in millisecs]

이 솔루션을 볼 수도 있습니다


9
그것은 시간을 나노초로 제공합니다. 밀리 초는 DATEDIFF (MS, @ StartTime, @ EndTime)입니다.
d512

11

또 다른 방법은 메뉴> 쿼리> 클라이언트 통계 포함을Client Statistics 통해 액세스 할 수 있는 SQL Server 내장 기능을 사용 하는 것입니다 .

개별 쿼리 창에서 각 쿼리를 실행하고 Client Statistics탭 바로 옆의 Messages탭 에 제공된 결과를 비교할 수 있습니다 .

예를 들어 아래 이미지에서 내 쿼리 중 하나에 대한 서버 응답을 얻는 데 걸린 평균 시간은 39 밀리 초입니다.

결과

여기 에서 실행 시간을 얻는 세 가지 방법을 모두 읽을 수 있습니다 . Estimated Execution Plan ctrlL쿼리에 대한 추가 조사 를 위해 표시해야 할 수도 있습니다.


7

더 좋은 방법은 쿼리의 n 반복 평균을 측정하는 것입니다! 보다 정확한 독서에 좋습니다.

declare @tTOTAL int = 0
declare @i integer = 0
declare @itrs integer = 100

while @i < @itrs
begin
declare @t0 datetime = GETDATE()

--your query here

declare @t1 datetime = GETDATE()

set @tTotal = @tTotal + DATEDIFF(MICROSECOND,@t0,@t1)

set @i = @i + 1
end

select @tTotal/@itrs

4
나는 변경 MICROSECONDMILLISECOND내가 사이에 줄 다음에 삽입 캐시 매번 지우는 begindeclare @t0 ...: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;. 매력과 정확히 내가 찾던 것처럼 작동합니다. +1
Daniel Z.

1
나는 yr 스 니펫을 사용하여 저장 프로 시저에 대한 증분 성능 조정을 매우 매끄럽게 측정했습니다!
JayJay 2012

둘 다 감사합니다. 나는 오랫동안 오랫동안 SQL을 해왔다. 기발한 언어. 그러나 꼬임이 무엇인지 알고 어떻게이를 유리하게 회전시키는 지 알게되면 많은 XD에 도움이됩니다
HumbleWebDev

3

통계 아이콘을 클릭하여 조회를 표시 한 후 실행하여 시간을 확보하고 조회의 효율성을 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.