클라이언트 세션에서 데이타 베이스로 보내는 SQL 문을 받아서 처리하는 프로세스
서버 프로세스는 정렬 , 합계 , 조인등의 작업을 수행할때 시스템의 CPU 시간을 가장 많이 소비함
--부모/자식 프로세스 생성 과정
select a.spid dedicated_server,
b.process clientpid
from v$process a, v$session b
where a.addr = b.paddr
and b.sid = (select sid from v$mystat where rownum=1)
/
DEDICATED_SE CLIENTPID
------------ ------------
1700538 1630904
sys@BWD> !ps -fp 1700538,1630904
UID PID PPID C STIME TTY TIME CMD
orabwd 1630904 1417636 0 20:47:58 pts/5 0:00 sqlplus
orabwd 1700538 1630904 0 20:47:58 - 0:00 oracleBWD (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
--1700538 프로세스가 1630904프로세스의 자식
--1630904 프로세스가 sqlplus프로세스의 자식
-- dedicated 서버에서 한개의 커넥션이 하나 이상의 세션을 갖는 예
scott@BWD> set echo on
scott@BWD> column username format a9
scott@BWD>select username, sid, serial#, server, paddr, status
from v$session
where username = USER
/
USERNAME SID SERIAL# SERVER PADDR STATUS
--------- ---------- ---------- --------- ---------------- --------
SCOTT 575 47 DEDICATED 070000001F67A068 ACTIVE
sys@BWD> set autotrace on statistics
select username, sid, serial#, server, paddr, status
from v$session
where username = USER
/
USERNAME SID SERIAL# SERVER PADDR STATUS
--------- ---------- ---------- --------- ---------------- --------
SCOTT 575 47 DEDICATED 070000001F67A068 ACTIVE --둘다 같은 dedicated server프로세스 주소를사용(한 커넥션만사용)
SCOTT 589 35 DEDICATED 070000001F67A068 INACTIVE --AUTOTRACE세션(세션을 지켜보다가 무엇을하는지 보고하는일수행)
Statistics
----------------------------------------------------------
8 recursive calls
0 db block gets
3 consistent gets
0 physical reads
0 redo size
936 bytes sent via SQL*Net to client
488 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
2 rows processed
set autotrace off
--※SQL*Plus에서 AUTOTRACE 기능을 활성화할 때 SQL*Plus는 사용자가 DML작업을 실행할 때 다음과 같은 단계를 수행
--1. 현재 커넥션을 이용하여 두번째 세션이 존재하지 않는다면 새로운 세션을 생성
--2. DML을 실행하는 세션의 초기 통계값을 기억하기 위해 SQL*Plus는 이 보조세션에 V$SESSTAT뷰를 조회하도록 요청.
--3. SQL*Plus는 원래 세션에서 DML작업실행.
--4. DML문이 완료되면 SQL*Plus는 두 번째 세션에 다시 V$SESSTAT를 조회하도록 요청하고, DML을 수행한 세션에 대하여 이전과 다르게 나타난 수치를 보여주는 리포트를 생성.
scott@BWD> disconnect(물리적인 커넥션 끊는명령어는 아님, DESTROY_ALL_SESSIONS명령어가 끊는명령어)
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options
--새로운세션
SYS@BWD> select username, sid, serial#, server, paddr, status
from v$session
where username = 'SCOTT';
no rows selected
--세션이 존재하지 않지만 여전히 물리적인 커넥션을 가진 프로세스를 갖고있다.
sys@BWD> select username, program
2 from v$process
3 where addr = hextoraw('070000001F67A068');
USERNAME PROGRAM
--------------- ------------------------------------------------
orabwd oracle@r3dev (TNS V1-V3)
--처음세션
scott@BWD> connect scott/tiger
Connected.
scott@BWD> select username, sid,serial#,server,paddr,status
2 from v$session
3 where username = 'SCOTT';
USERNAME SID SERIAL# SERVER PADDR STATUS
--------- ---------- ---------- --------- ---------------- --------
SCOTT 589 43 DEDICATED 070000001F67A068 ACTIVE --이전과 동일한PADDR
--같은 물리적 커넥션을 사용하고있지만 다른 SID를 갖고있다.
h3. shared server를 사용해서 로그인
{code:sql}
scott@BWD> select a.username, a.sid, a.serial#, a.server,
a.paddr, a.status, b.program
from v$session a left join v$process b
on (a.paddr = b.addr)
where a.username = 'SCOTT';
USERNAME SID SERIAL# SERVER PADDR STATUS PROGRAM
------------------------------ ----------- ----------- --------- ---------------- -------- ------------------------------------------------
SCOTT 577 20 SHARED 070000001F67B028 ACTIVE oracle@r3dev (S000)
1 rows selected.
--프로세스가 shared server라는것을 문자열 S000을 통해 알 수 있다.
--다른세션
SYS@BWD> select a.username, a.sid, a.serial#, a.server,
a.paddr, a.status, b.program
from v$session a left join v$process b
on (a.paddr = b.addr)
where a.username = 'SCOTT';
USERNAME SID SERIAL# SERVER PADDR STATUS PROGRAM
------------------------------ ----------- ----------- --------- ---------------- -------- ------------------------------------------------
SCOTT 577 20 NONE 070000001F67A848 INACTIVE oracle@r3dev (D001)
1 rows selected.
--PADDR,프로세스 이름 바뀜.
--idle상태인 처음 세션은 이제 dispatcher D000와 관련되어 있다.
--단일 프로세스를 가리키는 다수의 세션을 관찰하기위한 다른방법은 없다.(dispatcher는 자신을 가리키는 수백,수천개의 세션을 가질 수 있기 때문)
--처음세션에서 위쿼리를 반복해서 실행을하면 계속 같은 PADDR을 조회 할 수 있다. 그러나 좀 더 많은 shared server 커넥션을 열어놓고 다른세션에서
shared server 커넥션을 사용하도록 하면, shared server가 변한다는 것을 발견할 수 있다.
--<세션1>
scott@BWD> select a.username, a.sid, a.serial#, a.server,
2 a.paddr, a.status, b.program
3 from v$session a left join v$process b
4 on (a.paddr = b.addr)
5 where a.username = 'SCOTT'
6 /
USERNAME SID SERIAL# SERVER PADDR STATUS PROGRAM
---------- ---------- ---------- --------- ---------------- -------- ------------------------------
SCOTT 576 35 SHARED 070000001F67B028 ACTIVE oracle@r3dev (S000)
--<세션2>
sqlplus scott/tiger@bwd
exec dbms_lock.sleep(20);
--<세션1>
--dbms_lock.sleep 이 실행되는 동안 shared server는 S001로 변경됨
scott@BWD> /
USERNAME SID SERIAL# SERVER PADDR STATUS PROGRAM
---------- ---------- ---------- --------- ---------------- -------- ------------------------------
SCOTT 576 37 SHARED 070000001F67B808 ACTIVE oracle@r3dev (S001)
--세션2가 완료됐을때 shared server는 다시 S000을 사용
scott@BWD> /
USERNAME SID SERIAL# SERVER PADDR STATUS PROGRAM
---------- ---------- ---------- --------- ---------------- -------- ------------------------------
SCOTT 576 37 SHARED 070000001F67B028 ACTIVE oracle@r3dev (S000)
-- 처음 쿼리시 shared server 는 S000
-- 다른 세션에서 긴작업 ( 이때 S000 을 할당받음)
-- 첫번째 세션에서 다시 쿼리를 날릴시 S001 로 할당 받음