กำลังรอให้ DBMS_SCHEDULER.CREATE_JOB หลายรายการเสร็จสิ้น

การออกแบบผลิตภัณฑ์ใช้ตารางแยกกันที่มีลายเซ็นคล้ายกันเพื่อเก็บข้อมูลประเภทต่างๆ

เพื่อให้คุณสามารถคำนวณแต่ละตารางแยกกันแบบขนานโดยไม่ต้องล็อค

ฉันปรับโค้ดการคำนวณให้เหมาะสมเพื่อให้ทำงานเร็วขึ้น 7 เท่า แต่การเพิ่มประสิทธิภาพอีก 10% ถัดไป ฉันคิดว่าต้องใช้เวลาเพิ่มขึ้น x10 ในการเขียนโค้ด/ทดสอบ

การคำนวณจะต้องดำเนินการบนตารางทั้งหมด ดังนั้นจึงสมเหตุสมผลในการคำนวณแบบขนาน (โดยเฉพาะเมื่อเซิร์ฟเวอร์มี 32 คอร์) เพื่อจุดประสงค์ดังกล่าว ฉันพบว่าแพ็คเกจ DBMS_SCHEDULER มีประโยชน์:

declare
  job1 clob := dbms_scheduler.generate_job_name('REPAYMENT_');
  job2 clob := dbms_scheduler.generate_job_name('REPAYMENT_');
begin
  dbms_scheduler.create_job(job_name => job1,
    job_type => 'PLSQL_BLOCK',
    job_action => 'begin calc_rep(30, DATE ''2012-01-01'', DATE ''2012-12-31''); end;',
    enabled => true,
    auto_drop => true);
  dbms_scheduler.create_job(job_name => job2,
    job_type => 'PLSQL_BLOCK',
    job_action => 'begin calc_rep(31, DATE ''2012-01-01'', DATE ''2012-12-31''); end;',
    enabled => true,
    auto_drop => true);
  dbms_output.put_line('jobs was finished');
end;
/

แต่ฉันไม่รู้ว่าจะรอให้งานเสร็จอย่างไรก่อนที่ข้อความ งานจะเสร็จสิ้น...

การโพล scheduler_jobs แบบวนซ้ำอย่างต่อเนื่องเป็นวิธีแก้ปัญหาที่ไม่มีประสิทธิภาพ แต่เป็นเพียงวิธีเดียวเท่านั้นที่อยู่ในใจ การค้นหาและเอกสารอย่างเป็นทางการไม่มีวิธีแก้ปัญหาที่เกี่ยวข้อง


person gavenkoa    schedule 01.07.2013    source แหล่งที่มา
comment
การสร้างงานไม่เริ่มต้น ดูเหมือนคุณต้องการ JOB CHAIN ​​ซึ่งคุณสามารถรันหลายขั้นตอน (งาน) ในลำดับเฉพาะ (หรือพร้อมกัน) ตู้ ATM ยุ่งเกินกว่าจะแจกโค้ดมากมาย โปรดดูที่ ที่นี่ เพื่อดูตัวอย่าง   -  person tbone    schedule 01.07.2013
comment
@tbone ขอบคุณสำหรับความสนใจ +1   -  person gavenkoa    schedule 02.07.2013


คำตอบ (1)


งานไม่ได้ใช้เพื่อความเท่าเทียม (อย่างน้อยนั่นไม่ใช่สิ่งที่พวกเขา ทำเพื่อ) งานใช้เพื่อเรียกใช้ขั้นตอนในเวลาใดเวลาหนึ่งและตามกำหนดเวลาเฉพาะ ดังนั้นคุณไม่ต้องเริ่มงานและรอให้งานเสร็จ

อย่างไรก็ตาม สิ่งที่คุณทำคือสร้างงานแต่อย่าเรียกร้องให้เริ่มทำงาน คุณจะต้องโทร dbms_scheduler.run_job( job_name => job1 ) เพื่อดำเนินการดังกล่าว สายนั้นจะถูกส่งกลับทันที และงานระยะยาวของคุณจะยังคงทำงานในเบื้องหลัง

ถ้าฉันเข้าใจคำถามของคุณถูกต้อง สิ่งที่คุณพยายามทำคือแยกการคำนวณที่ซับซ้อนออกแล้วรันแบบคู่ขนาน แต่ไม่จำเป็นต้องรันซ้ำๆ ตามกำหนดเวลา สิ่งที่คุณต้องการคือ DBMS_PARALLEL_EXECUTE ซึ่งคุณจะทำลายสิ่งที่ยิ่งใหญ่ งานออกเป็นชิ้น ๆ ตามเกณฑ์บางอย่างและดำเนินการทีละรายการ

person eaolson    schedule 24.07.2013