set timing을 이용한 SQL 실행 속도 측정법

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

set timing을 이용한 SQL 실행 속도 측정법

SQL*Plus에서 실행시킨 SQL 또는 PL/SQL 블록의 실행속도를 보려면 다음과 같이 set timing on을 사용하면 된다.

SQL> set timing on
SQL> select count(*) from all_objects;

  COUNT(*)
 ---------
     40746

 Elapsed: 00:00:11.87

그런데, SQL 하나하나의 속도가 하니라 한 블록의 SQL 실행속도를 알고 싶을 때는 어떻게 해야 할까? 예를 들어 다음과 같이 work.sql에 여러 SQL이 들어 있다고 생각해보자.

-- work.sql
insert into t values ('2007-01-01', 'aaa');
insert into t values ('2007-01-02', 'bbb');
insert into t values ('2007-01-03', 'ccc');
insert into t values ('2007-01-04', 'ddd');
insert into t values ('2007-01-04', 'eee');

SQL*Plus에서 set timing on한 상태에서 work.sql을 실행시키면 결과는 다음과 같이 각각의 SQL에 대한 실행시간이 나올 뿐이다.

SQL> set echo on
SQL> @work.sql
SQL> insert into t values ('2007-01-01', 'aaa');

1 row created.

Elapsed: 00:00:00.15
SQL> insert into t values ('2007-01-02', 'bbb');

1 row created.

Elapsed: 00:00:00.00
SQL> insert into t values ('2007-01-03', 'ccc');

1 row created.

Elapsed: 00:00:00.00
SQL> insert into t values ('2007-01-04', 'ddd');

1 row created.

Elapsed: 00:00:00.01
SQL> insert into t values ('2007-01-04', 'eee');

1 row created.

Elapsed: 00:00:00.00

전체 SQL의 실행 속도를 보고 싶다면 begin ~ end를 써서 SQL을 묶어주면 된다. 즉 work.sql 파일의 시작과 끝을 begin ~ end로 묶어준 다음 실행시키면 된다.

-- work.sql
begin
insert into t values ('2007-01-01', 'aaa');
insert into t values ('2007-01-02', 'bbb');
insert into t values ('2007-01-03', 'ccc');
insert into t values ('2007-01-04', 'ddd');
insert into t values ('2007-01-04', 'eee');
end;
/

이에 대한 실행결과는 다음과 같다.

SQL> @work.sql
SQL> begin
  2  insert into t values ('2007-01-01', 'aaa');
  3  insert into t values ('2007-01-02', 'bbb');
  4  insert into t values ('2007-01-03', 'ccc');
  5  insert into t values ('2007-01-04', 'ddd');
  6  insert into t values ('2007-01-04', 'eee');
  7  end;
  8  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.15

또는 work.sql 파일을 수정하고 싶지 많다면 SQL*Plus에서 파일 실행부를 begin ~ end로 묶어줘도 된다. 한꺼번에 여러 파일을 실행해야 한다면 이게 더 편할지도 모르겠다.

SQL> set echo on
SQL> begin
  2  @work.sql
  2  insert into t values ('2007-01-01', 'aaa');
  3  insert into t values ('2007-01-02', 'bbb');
  4  insert into t values ('2007-01-03', 'ccc');
  5  insert into t values ('2007-01-04', 'ddd');
  6  insert into t values ('2007-01-04', 'eee');
  7  end;
  8  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.03

set echo on 상태라면 @work.sql을 입력한 후 엔터키를 누르면 위와 같이 파일 내용이 표시된다. set timing on 대신 timing 명령을 사용해 여러 SQL의 실행속도를 측정할 수도 있다.

timing start
insert into t values ('2007-01-01', 'aaa');
insert into t values ('2007-01-02', 'bbb');
insert into t values ('2007-01-03', 'ccc');
insert into t values ('2007-01-04', 'ddd');
insert into t values ('2007-01-04', 'eee');
timing stop

위와 같이 work.sql의 맨 앞과 뒤에 각각 timing start, timing stop을 추가하면 다음과 같이 각각의 SQL에 대한 실행속도뿐 아니라 전체 실행속도까지 한꺼번에 볼 수 있다.

SQL> set echo on
SQL> @work.sql
SQL> timing start
SQL> insert into t values ('2007-01-01', 'aaa');

1 row created.

Elapsed: 00:00:00.00
SQL> insert into t values ('2007-01-02', 'bbb');

1 row created.

Elapsed: 00:00:00.01
SQL> insert into t values ('2007-01-03', 'ccc');

1 row created.

Elapsed: 00:00:00.00
SQL> insert into t values ('2007-01-04', 'ddd');

1 row created.

Elapsed: 00:00:00.00
SQL> insert into t values ('2007-01-04', 'eee');

1 row created.

Elapsed: 00:00:00.01
SQL> timing stop
Elapsed: 00:00:00.03

timing stop 다음에 찍힌 시간이 전체 SQL을 실행하는 데 걸린 시간이다.