본문 바로가기

ORACLE

ORACLE TPS v1.0

ORACLE TPS 

 

 

1.  ORACLE TPS

A.   TPS 정의

TPS (Transactions per Second) is a metric used to measure or benchmark database performance.

orafaq에 위와 같이 정의되어있다. TPS 라는 이니셜을 보아서는 항상 SECOND 값을 사용해야 할 것 같이 보이지만 FREE LISTS 의 경우에는 글제목에 NUMBER OF TRANSACTIONS PER MINUTE /HOUR 라는 단어를 사용하기도 했다.

 

2.  TPS 조회쿼리

A.   TPS 조회 쿼리(from FreeList)

select

  round(sum(s.value / (86400 * (SYSDATE - startup_time))),3) "TPS"

from

  v$sysstat  s

 ,v$instance i

where s.NAME in ('user commits','transaction rollbacks') /

 

위의 쿼리를 보면 V$INSTANCE V$SYSSTAT을 사용한다. (from FREELIST)

 

V$INSTANCE DB STARTUP 시간 정보를 가지고오기 위해 사용한다. STARTUP 시간을 가져와 DB가 시작된 이래의 시간정보를 구해 해당 시간을 가지고 단위 TRANSACTION 을 구한다.

 

Tx(TRANSACTION 대신 사용하겠다.) 의 종료는 COMMIT 혹은 ROLLBACK 으로 이루어진다. 때문에 V$SYSSTAT 에서 위와같이 NAME user commits, transaction rollbacks 를 사용하였다.

B.   TPS 조회 쿼리 (자작)

위의 쿼리는 DB 가 시작된 시점을 가지고 산출한 값으로 DB에 일량이 한참 많을 때 나오는 값과는 차이가 있다. 이러한 값을 구하고 싶을 때 사용할 쿼리를 만들어보았다.

 

col name for a20

col value for 9999999999

set serveroutput on

 

var l_new_tps_value number;

var l_old_tps_value number;

var l_new_time varchar2(20);

var l_old_time varchar2(20);

 

begin

        select sum(value),to_char(systimestamp,'sssss.ff')

        into :l_new_tps_value,:l_new_time from v$sysstat

        where name in ('user commits','user rollbacks');

 

        dbms_output.put_line('Time : '||to_number(:l_new_time - :l_old_time)||' sec');

        dbms_output.put_line('Sigma: '||to_number(:l_new_tps_value - :l_old_tps_value));

        dbms_output.put_line('Delta: '||round(to_number(:l_new_tps_value - :l_old_tps_value)/nvl(to_number(:l_new_time - :l_old_time),1)));

 

        :l_old_tps_value := :l_new_tps_value;

        :l_old_time := :l_new_time;

end;

/

 

위의 쿼리에서는 현재와 과거의 값을 가지고 DELTA 값을 구했다. 다시 말해 쿼리를 수행 후 다시 수행 ( / ) 을 했을 때 그 시간 간격과 변화한 STAT 값을 가지고 구했다.

 

3.  글을 마치며

A.   인터넷을 뒤지면서도 Tx의 종료가 USER COMMIT, USER ROLLBACK 이란 문장이 확실히 나온 것을 보지 못했다. 추후 /*+ TPS 를 구하기 위해 사용하는 지표  그리고 시간간격에 있어 현재와 과거 어느시점을 가지고 구해야 하는지 */ 에 대해 명확하지 않았다.