출 처 : http://cafe.naver.com/oraeducation.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=42&
Oracle이 제공하는 대기 이벤트 중 가장 잘못 이해되고 있는 것 중 하나가 SQL*Net과 관련된 것이다.
아래에 최근에 Ask Exem에 등록된 질문이 있다.
SQL*Net 대기 이벤트에 대한 질문
이런 오해가 생기는 근본적인 원인은 대기 이벤트에 대한 정확한 이해의 부족에 있다.
다음과 같이 이해하면 그림이 더욱 명확해진다.
대기 이벤트 = System API Call
가령 SQL*Net message to client 대기는 Server Process가 OS에게 Network Send API 요청을 하고 응답이 오기를 기다린다는 것을 의미한다.
OS는 Server Process가 요청한 Data를 TCP Send Buffer에 넣는 것으로 일을 마치고 Server Process에게 응답을 보낸다.
즉, SQL*Net message to client 대기는 실제 Network 전송이 끝나기를 기다린다는 의미가 아니라 OS가 Send Buffer에 성공적으로 Data를 등록하기를 기다린다는 것을 의미한다.
Nework API들은 이런 속성을 지니고 있다.
{ 대기 이벤트 = System API Call } 이라는 명제를 기억하면 쉬워집니다.
가령 SQL*Net message from/to client 이벤트에 대한 대기는 이렇게 해석할 수 있습니다.
1.Client가 Server Process에게 Data를 요청한다.
2.Server Process는 Data를 Fetch한 후 OS에게 Network Data전송을 요청하고 OS로 부터 응답이 올 때까지
SQL*Net message to client이벤트를 대기 한다.
OS는 Oracle로 부터 받은 Data를 Send Buffer에 채우고 Oracle에게 전송이 완료되었다는 응답을 보낸다.
이때 SQL*Net messaage to client 이벤트에 대한 대기가 끝이 난다.
3.Server Process는 OS에게 Client로 부터 전송된 Network Data를 요청하고 OS로 부터 응답이 올 때까지
SQL*Net message from client 이벤트를 대기한다.
OS는 Receive Buffer에 Client가 보낸 Data가 도착하면 Oracle에게 전송이 완료되었다는 것을 알린다.
이때 SQL*Net message from client 이벤트에 대한 대기가 끝이 난다.
Oracle은 전송받은 Client요청을 처리하고 다시 2번 단계로 돌아 간다.
SQL*Net 으로 시작하는 모든 대기 이벤트들은 위와 같은 Mechanism으로 동작합니다.
즉 Oracle Server Process와 OS간의 Network API Call에서 걸린 시간이 곧 대기 시간입니다.
만일 주고 받는 Data크기가 커서 한번의 API Call로 처리가 않되면 여러번 호출이 일어나고 그때는 "more"라는 수식어가 이벤트 명에 붙게 됩니다.
위의 과정을 곱씹어 보면 다음과 같은 사실들을 추론할 수 있습니다.
1.SQL*Net message from client 대기는 Network 성능과는 직접적인 관련이 없다.
즉 대기 시간이 늘어 난다고 해서 Network이 느리다는 것을 의미하지는 않는다.
2.Oracle이 Client에게 응답을 보내고 이후 Client로 부터 다시 요청이 올 때까지 Idle하게 대기하는 시간이
SQL*Net message from client 대기 시간이다.
따라서 SQL 수행 요청시에는 반드시 이런 이벤트에 대한 대기가 발생할 수 밖에 없다.
3.SQL*Net message to client 대기는 Send Buffer에 여유공간이 빨리 확보되지 않으면 대기 시간이 증가 할 수 있다.
즉, Send Buffer의 크기가 너무 작거나 Oracle이 전송을 요청하는 Data량이 Network 전송량에 비해 지나치게
큰 경우 대기 시간이 증가 한다. 일반적으로는 매우 짦은 대기시간을 보인다.
"more"라난 수식어가 붙는 경우에는 Data 전송량이 커서 한번에 전송하지 않고 여러번 나누어서 한다는 것을 의미합니다.
"more"가 붙은 경우에는 message가 아닌 "data"라는 용어가 사용된다는 것에 주의하세요.
가령 아주 긴 SQL문장의 수행을 Oracle에게 요청하는 경우
Oracle은 OS에 전송을 요청하고 응답이 올때 까지 SQL*Net more data form client 이벤트를 대기합니다.
거꾸로 아주 큰 Data를 Client에게 보내 주어야 하는 경우(LOB이 대표적) Oracle은 SQL*Net more data to client 이벤트를
대기합니다.
break/reset 이벤트는 1)통신을 Break하겠다, 2) 그리고 Reset(초기화)하겠다라는 일종의 대화를 의미합니다.
가령 Ouery를 수행하다가 Error가 발생했다고 가정하면, Server Process는 현재 통신을 Break하고 Reset하겠다는 응답을 OS에 전송요청하고 응답이 올때까지 이 이벤트를 대기하게 됩니다.
다시 한번 기억할 것은 Orale이 대기하는 시간은 Client와의 통신 시간이 아니라 OS에 대한 Network API Call의 수행시간이라는 것입니다.
이것을 오해하면 SQL*Net류의 이벤트들에 대해 완전히 잘못된 해석을 하게 됩니다.
'Oracle > SQL' 카테고리의 다른 글
OPTIMIZER - PLAN TABLE 생성 과정 (Oracle 10g) (0) | 2011.08.10 |
---|---|
APPEND & NOLOGGING (0) | 2011.08.10 |
my_sess_event, show_param, system_event, sesstat, undosize (0) | 2011.08.08 |
sqlplus 에서 백스페이스 사용 (0) | 2011.08.03 |
alter 로 Primary key 변경하기 (0) | 2011.08.03 |