2013-08-05 6 views
2

Oracle Pro * C로 작성된 UNIX 프로세스가 매우 오래 걸리는 많은 행을 쿼리한다고 가정 해보십시오. 수동으로 또는 시간 초과 메커니즘 등으로 프로세스를 종료하면 Oracle 데이터베이스에서 실행중인 쿼리가 중지되거나 데이터베이스 인스턴스를 계속 사용 중 상태로 실행됩니까?리눅스 프로세스를 죽이면 Oracle 데이터베이스에서 질의 작업을 중단 하시겠습니까?

구성 : 오라클 데이터베이스는 10/11g, 레드햇 엔터프라이즈 리눅스 4/5/6

건배,

에 Tyn은

는 정보 추가 : 나는 3 계층 아키텍처 소프트웨어를 쓰고있어 그 실행 고객 시스템. 최종 사용자가 모든 필터의 선택을 취소하고 로그 데이터를 가져 오는 경우 결과는 거대하며 쓸데없는 모든 여분의 로그에 대해 시간이 오래 걸릴 것입니다. 필터링되지 않은 쿼리를 방지하기 위해 UI에 추가했지만 올바르게 수정하려고합니다.

그래서 클라이언트와 서버 측 프로세스 인프라에 시간 초과를 추가했습니다. 난 단지 서버 측 프로세스가 중단되었을 때 오라클이 큰 쿼리로 바쁘지 않았는지 확인하고 싶었습니다.

+0

Q : 쿼리가 죽을까요? A : 네. Q : 즉시 * 쿼리를 죽일 것입니까? A : 아니오, 반드시 그런 것은 아닙니다. – paulsm4

+2

먼저 쿼리를 실행중인 DB 세션을 종료하도록 DBA에 요청해야합니다. – tilley31

+0

신뢰할 수 없습니다. 최선의 방법은 다른 방향으로가는 것입니다. 오라클 측 프로세스를 찾아서 DBA가이를 죽이면 Pro * C 프로세스가 중단됩니다. –

답변

1

다릅니다.

클라이언트 프로세스가 데이터베이스에 요청을 보내면 데이터베이스는 응답이있을 때까지 해당 요청을 계속 처리합니다. 요청을 보낸 후에 클라이언트 프로세스가 종료되면 데이터베이스는 응답을 보낼 준비가 될 때까지이를 알 수 없습니다. 이 시점에서 클라이언트 프로세스가 실패했는지 확인하고 요청을 포기할 수 있습니다. 당신이 걱정하는 성능 문제는 결과의 첫 번째 행을 반환하기 위해 쿼리를 실행하는 데 데이터베이스가 오래 걸리므로 클라이언트 프로세스를 종료해도 아무런 영향을 미치지 않습니다.

반면 성능 문제로 인해 데이터베이스에서 모든 행을 가져 오기 위해 쿼리를 실행하는 데 시간이 오래 걸리고 클라이언트 응용 프로그램을 가져 오는 데 오랜 시간이 걸리는 경우 데이터베이스의 모든 데이터가 클라이언트를 죽이면 쿼리 실행이 중지됩니다. 무대 뒤에서, 프로세스가 항상 클라이언트

  • 데이터베이스 요청 데이터베이스가 결과의 첫 배치를하면
  • , 그것은 클라이언트로 전송 처리를 시작 요청을 전송

    • 것을 기억
    • 클라이언트는 결과의 첫 번째 일괄 처리를 처리하고 다음 일괄 처리를 요청합니다.
    • 데이터베이스는 다음 일괄 처리를 처리하고 다음 일괄 처리를 클라이언트에 보냅니다.
    • 더 이상 resu가 없을 때까지 반복하고 반복합니다. 돌아올거야.

    데이터베이스가 첫 번째 결과 묶음을 생성하기를 기다리는 대신 반복적 인 부분에서 대부분 소비되는 경우 클라이언트 프로세스를 중지하면 데이터베이스가 더 많은 시간을 소비하여 더 많은 일괄 처리를 생성하지 않게됩니다. 데이터베이스 설정에 따라 (특히 DCD (Dead connection detection)이 사용되는지 여부에 따라) 클라이언트 프로세스가 결과의 다음 일괄 처리를 요청하기를 기다리면서 거기에 앉아있을 수 있기 때문에 여전히 데이터베이스 세션을 종료 할 수 있지만 ' 기다리는 동안 자원을 적극적으로 소비해야합니다.