2014-04-11 2 views
3

무엇이 여기에 있습니까? 장기 실행 쿼리를 테스트하려고합니다.오라클 - 장기 실행 쿼리를 찾을 수 없음

나는 약 4 억 개의 행이있는 테스트 테이블을 mytest라고합니다. 내가 다른 창에서 SQLPLUS

select * from mytest를 실행, 나는 아래

select s.username, s.sid, s.serial#, s.schemaname, 
    s.program, s.osuser, s.status, s.last_call_et 
    from v$session s 
where last_call_et >= 1 – this is just for testing 

내 장기 실행 쿼리 위의 쿼리의 결과에 표시되지 않습니다 내 장기 실행 쿼리 확인하기 위해 스크립트를 실행. 조건을> = 0 이상으로 변경하면 쿼리가 계속 실행되고 있음에도 불구하고 내 쿼리가 INACTIVE 및 last_call_et이 0으로 표시됩니다. 위의 select * from...과 같은 장기 실행 쿼리를 볼 수 있도록하려면 어떻게해야합니까?

답변

1

먼저

덕분에, 당신은 일반적으로 장기 실행 쿼리 될 수 없습니다 있기 때문에 select * from mytest 같은 쿼리가 정말 내부적으로 무엇을하는지 이해할 필요가있다. 오라클은 결과 집합을 구체화 할 필요가 없으며 단일 호출의 결과로 모든 데이터를 읽지 않습니다. 대신 오라클이 일련의 작업을 수행하는 일련의 호출이 있습니다. 대화는 이런 식으로 진행됩니다.

  • 클라이언트 : 안녕하세요 오라클, 나를 위해 쿼리를 실행 : select * from mytest
  • 오라클 : 물론이지 (0-last_call_et 재설정는 새로운 통화가 시작된 반영하기 위해). 쿼리 계획을 생성하고 커서를 열었습니다. 여기에 핸들이 있습니다. 실제로 아무런 작업도 수행하지 않았습니다. 실제로 이 쿼리를 실행합니다.
  • 클라이언트 : Cool, thanks. 이 커서 핸들을 사용하여 은 다음 50 개의 행을 가져옵니다. 페치 크기는 클라이언트 측 설정입니다.
  • 오라클 : 새로운 호출이 시작되었음을 반영하여 last_call_et이 재설정됩니다. 나는 테이블 전체를 스캔하기 시작했고, 블럭을 읽고, 50 개의 행을 얻었다. 여기 있습니다.
  • 클라이언트 : 확인해 보았습니다. 을 처리했습니다. 모든 데이터는 오라클이 지금까지 정말를 얻기 위해 블록의 소수를 읽는 것보다 더 많은 일을하도록 요청되고이 과정에서 어떤 시점에서

인출 될 때까지이 커서 핸들을 사용하여, 향후 50 개 행을

  • 반복을 가져 오기 50 행 (또는 클라이언트가 요청한 페치 크기). 어느 시점에서든 클라이언트는 다음 데이터 배치를 요청할 수 없기 때문에 오라클은 오랜 기간 실행하지 않아도됩니다. 오라클은 더 많은 데이터에 대한 요청 사이의 애플리케이션 생각 시간을 추적하지 않습니다. 클라이언트가 꽉 루프에서 데이터를 가져 오는 GUI인지 또는 결과를 사람에게 표시하고 사람을 기다리는 지 여부는 알 수 없습니다 "다음"버튼을 누르십시오. 거의 대부분의 시간 동안 세션은 클라이언트가 다음 배치의 데이터를 요청할 때까지 기다리고 있기 때문에 항상 INACTIVE이 될 것입니다 (일반적으로 데이터의 마지막 배치를 포맷하고 디스플레이를 완료 할 때까지하지 않습니다). 표시 작업).

    오랫동안 실행되는 쿼리에 대해 대부분의 사람들은 오라클이 클라이언트에서 데이터를 가져 오기 위해 기다리지 않고 오랫동안 적극적으로 처리하고 있다는 쿼리에 대해 이야기합니다.

  • +0

    Coool 설명 저스틴 !! –

    +0

    답변 해 주셔서 대단히 감사합니다. 이것은 매우 도움이됩니다. – user3524242

    +0

    안녕하세요 저스틴, 오라클이 select * from 쿼리를 처리하는 방법에 대한 귀하의 응답과 설명에 다시 한 번 감사드립니다. 내가 가진 한 가지 질문은 v $ 세션이 last_call_et을 0으로 표시하는 이유는 무엇입니까? – user3524242

    관련 문제