programing

쿼리 진행 상황 확인(Oracle PL/SQL)

telebox 2023. 10. 4. 21:15
반응형

쿼리 진행 상황 확인(Oracle PL/SQL)

저는 오라클 데이터베이스를 사용하는 웹 앱의 개발자입니다.그러나 처리하는 데 시간이 걸리는 데이터베이스 작업을 UI가 트리거하는 경우가 많습니다.따라서 고객은 이러한 상황이 발생했을 때 진행 바를 원합니다.

최근에 두 번째 연결에서 V$SESSION_LONGOPS를 쿼리할 수 있다는 것을 발견했습니다. 이것은 훌륭하지만 6초 이상 걸리는 작업에서만 작동합니다.6초가 지나야 UI의 진행 표시줄을 업데이트할 수 있습니다.

저는 V$SESS에서 대기 시간에 대한 조사를 해보았지만 제가 본 바로는 쿼리를 기다리는 것은 포함되지 않습니다.

현재 실행 중인 세션 쿼리의 진행 상황을 파악할 수 있는 방법이 있습니까?아니면 6초가 지날 때까지 진행 바를 숨겨야 하나요?

이러한 작업은 Pl/SQL 호출입니까, 아니면 SQL을 장기적으로 실행하는 작업입니까?

하면 PL/SQL 할 수 있습니다.SET_SESSION_LONGOPS()DBMS_APPLICATION_INFO꾸러미의우리는 이 메시지들을 감시할 수 있습니다.V$SESSION_LONGOPS. 자세히 알아보세요.

이 작업을 수행하려면 작업 단위로 작업을 정량화할 수 있어야 합니다.이것들은 시간이 아닌 구체적인 것의 반복이어야 합니다.그래서 만약 연산이 10000개의 행을 삽입한다면 그것을 10개의 배치로 분할할 수 있습니다.totalwork 수, parameter수즉,수)입니다.10 SET_SESSION_LONGOPS를 하여 ) SET_SESSION_LONGOPS() 를 1000 시킵니다를 시킵니다.sofar매개 변수. .이렇게 하면 열 블록의 온도계를 렌더링할 수 있습니다.

이러한 메시지는 세션 기반이지만 동일한 세션 및 SID에서 현재 메시지와 이전 메시지를 자동으로 구분할 수 있는 방법은 없습니다.context그런 다음 이 값을 사용하여 보기를 필터링할 수 있습니다.


이것은 우리가 청크로 나눌 수 있는 방법이 없기 때문에, 한 번의 오래 실행되는 쿼리에는 작동하지 않을 것입니다.

나는 이것이 매우 유용하다는 것을 알았습니다.

dbms_session.set_module("MY Program" , "Kicking off ... ")
..
dbms_session.set_action("Extracting data ... ")
..
dbms_session.set_action("Transforming data ... ")
..

다음을 사용하여 진행 상황을 모니터링할 수 있습니다.

select module , action from v$session where sid = :yoursessionid

와 웹 을 꽤 해왔습니다.Oracle가 정확하지 막대보다,했습니다(la것)보다 Microsoft's진행률 막대는 나를 짜증나게 합니다), 그리고 불행히도 쿼리 진행률을 정확하게 결정하는 실수 없는 방법은 없습니다.

장기적인 운영 기능에 대한 연구는 감탄할 만하며 데이터베이스 쿼리의 진행 상황을 보다 신뢰성 있게 만드는 데 도움이 될 것이 분명하지만, 웹 작업의 트랜잭션 진행에 영향을 미칠 수 있는 수많은 다른 변수(네트워크 로드, 데이터베이스 로드, 애플리케이션 서버 로드, 클라이언트 측 데이터 구문 분석, t)를 고려할 수는 없습니다.사용자가 제출 버튼을 1,000회 클릭하는 등).

저는 자바스크립트 콜백을 이용한 불확정 진행방식을 고수하겠습니다.구현이 훨씬 쉬우며 사용자의 기대를 적절하게 관리할 수 있습니다.

V$_SESSION_LONGOPS를 사용하려면 TIMED_STATISTIS=true 또는 SQL_TRACE=true를 설정해야 합니다.그러려면 데이터베이스 스키마에 ALTER SESSION 시스템 권한을 부여해야 합니다.

V$_SESSION_LONGOPS를 복잡하고 오래 실행되는 쿼리로 사용해 본 적이 있습니다.그러나 V$_SESSION_LONGOPS는 전체 테이블 스캔, 조인 연산 등과 같은 쿼리 부분의 진행 상황을 보여줄 수 있음이 나타났습니다.

참고 항목: http://www.dba-oracle.com/t_v_dollar_session_longops.htm

사용자가 할 수 있는 일은 "쿼리가 여전히 실행 중"임을 사용자에게 보여주는 것입니다.저는 이를 실행했습니다.<DIV><TD>브라우저에 의해 전송되는 모든 상태 요청에 따라 시간이 길어집니다.됩니다에 시작됩니다.window.SetTimeout(매 3초) 및 서버측 프로시저에 대한 AJAX 호출입니다.서버측 프로시저에 의해 반환된 상태 보고서는 "아직 실행 중입니다"라고만 표시됩니다.비)즉,<DIV>) 의 5% 합니다.<TD>폭은 매번이며 100%를 보인 후 5%로 재설정됩니다.

장기간 실행 중인 쿼리의 경우 별도의 테이블에서 소요된 시간을 추적할 수 있으며, 경우에 따라서는 where 절을 변경하기 위한 개별 항목을 사용할 수도 있습니다.클라이언트 측 대화 상자에서 평균 시간에 방금 경과한 시간을 더한 값을 표시할 수 있습니다.

서버 측에서 여러 단계를 수행하는 PL/SQL 프로시저 등을 장시간 실행하는 경우 다음을 시도합니다.

  • 상태 메시지에 대한 표
  • 사용자가 시작하는 모든 프로세스에 고유한 키를 사용합니다.제안: 클라이언트 측의 자바스크립트 날짜(밀리초) + 세션 ID.
  • 브라우저 창에서 링크를 통해 롱런 절차를 시작할 경우 DBMS_JOB을 사용하여 작업을 생성합니다.절차를 직접 실행하는 대신 절차를 실행하기 위해 제출
  • PRAGMA ANUTOUCTION_TRANSACTION을 사용하여 상태 테이블을 업데이트하는 짧은 프로시저를 작성합니다.이 프래그마를 사용하면 기본 프로시저의 업데이트를 커밋하지 않고도 상태 테이블에 업데이트를 커밋할 수 있습니다.기본 절차의 각 주요 단계에는 이 상태표에 고유한 항목이 있어야 합니다.
  • 브라우저에서 호출할 상태 테이블을 쿼리하는 절차 작성
  • 사용자가 "취소"를 클릭하거나 창을 닫을 경우 AJAX 호출에 의해 호출되는 절차 작성
  • 각 단계를 완료한 후 주 절차에서 호출하는 프로시저를 작성합니다. 취소 플래그가 설정되어 있거나 브라우저가 60초 동안 상태를 쿼리하지 않은 경우 상태 테이블을 쿼리하고 20,000초 안에 숫자로 예외를 제기합니다.주 프로시저의 예외 처리기에서 이 오류를 찾아 롤백하고 상태 테이블을 업데이트합니다.

언급URL : https://stackoverflow.com/questions/15938040/determining-querys-progress-oracle-pl-sql

반응형