programing

PL/SQL에서 스레드화를 사용할 수 있습니까?

telecom 2023. 6. 14. 21:41
반응형

PL/SQL에서 스레드화를 사용할 수 있습니까?

PL/SQL에 비동기 호출 기능이 있습니까?코드 블록에 있는 경우 프로시저를 여러 번 호출하고 프로시저가 언제 무엇을 반환하는지 신경쓰지 않습니다.

BEGIN
  myProc(1,100);
  myProc(101,200);
  myProc(201,300);
  ...
  ...

END;

의 경우,내 Proc(1,실행되기 에 내 200가 를 마칠 까지 기다리지
감사해요.

DBMS_Scheduler 및 DBMS_JOB 접근 방식의 경우 +1이지만 다른 접근 방식을 사용해야 하는지도 고려해야 합니다.

절차가 행 단위로 실행되는 경우 속도가 느릴 경우 절차를 여러 번 동시에 실행하는 것이 아니라 설정 기반 접근 방식이 사용되도록 하는 것이 정답일 수 있습니다.그런 다음 병렬 쿼리와 병렬 DML을 사용하여 프로세스의 벽 시계 시간을 줄일 수도 있습니다.

나는 이것이 매우 흔한 잘못이기 때문에 이것을 언급합니다.

DBMS_JOB에 다음과 같이 제출합니다.

declare
  ln_dummy number;
begin
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(1,100); end;');
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(101,200); end;');
  DBMS_JOB.SUBMIT(ln_dummy, 'begin myProc(201,300); end;');
  COMMIT;
end;

작업을 처리하기 위해 스레드를 생성하려면 job_queue_processes 매개 변수를 >0으로 설정해야 합니다.user_jobs 보기를 검사하여 작업을 쿼리할 수 있습니다.

이는 Oracle 9i에 적용되지만 10g의 지원이 무엇인지는 확실하지 않습니다.자세한 내용은 여기를 참조하십시오.

편집: 누락된 COMMIT가 추가되었습니다.

DBMS_Scheduler를 확인해 보는 것이 좋습니다.

완전성을 위해 편집:

DMBS_Scheduler는 Oracle 10g에서 사용할 수 있습니다.이 이전 버전의 경우 DBMS_JOB는 거의 동일한 작업을 수행합니다.

자세한 내용은 http://download.oracle.com/docs/cd/B12037_01/server.101/b10739/jobtosched.htm 을 참조하십시오.

PL/SQL 병렬 처리의 경우 다음 옵션이 있습니다.

이렇게 하면 PL/SQL에서 포킹 및 스레딩을 "에뮬레이트"할 수 있습니다.물론 이러한 기능을 사용하면 병렬로 실행되는 프로시저 간의 통신이 필요하다는 것을 알 수 있습니다.확인 방법:

개인적으로 DBMS_Scheduler를 사용하여 병렬 처리 시스템을 구현하고 DBMS_Pipe를 사용하여 "스레드" 간의 통신을 수행했습니다.저는 이 둘의 조합에 매우 만족했고, 저의 주요 목표(특정 중량 절차로 주요 처리 시간을 줄이는 것)가 달성되었습니다!

당신은 11g부터 시작하는 다른 옵션이 있습니다.Oracle은 DBMS_PARALL_EXECUTE라는 이름의 사용자가 원하는 작업과 유사한 작업을 수행하는 패키지를 도입했습니다.

그들에 따르면, "DBMS_PARALL_EXECUTE 패키지는 사용자가 테이블 데이터를 병렬로 점진적으로 업데이트할 수 있게 해줍니다."사용 방법에 대한 꽤 좋은 요약은 여기에 있습니다.

기본적으로 Oracle이 작업을 분할하는 데 사용할 방법을 정의합니다(이 경우에는 핵심 값을 전달하는 것으로 보입니다). 그러면 Oracle은 각 작업을 개별적으로 시작합니다.물론 사용하기 위해서는 약간의 계획과 약간의 추가 코딩이 필요하지만, 어떤 것도 해서는 안 되는 것은 없습니다.

이와 같이 승인된 방법을 사용할 경우 Oracle은 각 독립 스레드를 모니터링하는 데 사용할 수 있는 데이터베이스 보기도 제공할 수 있습니다.

병렬(멀티 스레드) PL/SQL을 수행하는 또 다른 방법은 다음과 같습니다.

http://www.williamrobertson.net/documents/parallel-plsql-launcher.html

dbms_job 또는 dbms_schedular를 사용할 때의 단점은 작업이 언제 완료되는지 잘 모른다는 것입니다.나는 당신이 신경쓰지 않는다고 읽었지만, 아마도 당신은 앞으로 당신의 생각을 바꿀 것입니다.

편집:

기사 http://www.devx.com/dbzone/10MinuteSolution/20902/0/page/1 은 또 다른 방법을 설명합니다.그것은 사용합니다.dbms_job그리고.dbms_alert알림은 작업이 완료되었음을 알리는 데 사용됩니다(콜백 신호).

다음은 플랫 파일로 데이터를 언로드하는 다양한 방법에 대한 설명입니다.한 가지 방법은 PL/SQL로 병렬 실행을 수행하여 작업 속도를 높일 수 있는 방법을 보여줍니다.

http://www.oracle-developer.net/display.php?id=425

여기에 나열된 askTom의 병렬 파이프라인 접근 방식은 더 복잡한 접근 방식을 제공하지만 DBMS Job 기법과 달리 작업이 완료될 때까지 실제로 일시 중지됩니다.즉, "비동기적" 기술을 요청하셨고 DBMS_JOB가 이에 적합합니다.

Oracle Advanced Queuing 사용을 고려해 보셨습니까?

언급URL : https://stackoverflow.com/questions/576802/can-we-use-threading-in-pl-sql

반응형