프린트 하기

OS환경 : Oracle Linux6.8(64bit)


DB 환경 : Oracle Database 11.2.0.4


설명:

{Wait Event == 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 message 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 from client 이벤트를 대기합니다. 거꾸로 아주 큰 Data를 Client에게 보내주어야 하는 경우(LOB이 대표적인 경우) Oracle은 SQL*Net more data to client 이벤트를 대기합니다. 


break/reset 이벤트는 1) 통신을 Break하겠다. 2) 그리고 Reset(초기화)하겠다라는 일종의 대화를 의미합니다. 가령 Query를 수행하다가 Error가 발생했다고 가정하면, Server Process는 현재 통신을 Break하고 Reset하겠라는 응답을 OS에 전송 요청하고 응답이 올 때가지 이 이벤트를 대기하게 됩니다. 


다시 한번 기억할 것은 Oracle이 대기하는 시간은 Client와의 통신 시간이 아니라 OS에 대한 Network API Call의 수행시간이라는 것입니다. 이것을 오해하면 SQL*Net 류의 이벤트들에 대해 완전히 잘못된 해석을 하게 됩니다. 


출처 : http://egloos.zum.com/bosoa/v/3761075

http://ukja.tistory.com/219