Menunggu penyelesaian beberapa DBMS_SCHEDULER.CREATE_JOB

Desain produk menggunakan tabel terpisah dengan tanda tangan serupa untuk menyimpan jenis data berbeda.

Sehingga Anda dapat melakukan penghitungan pada setiap tabel secara terpisah secara paralel tanpa kunci.

Saya mengoptimalkan kode penghitungan sehingga menjalankannya 7 kali lebih cepat, tetapi peningkatan kinerja 10% berikutnya menurut saya memerlukan x10 lebih banyak waktu untuk pengkodean/pengujian.

Penghitungan harus dilakukan pada semua tabel sehingga logis untuk melakukan penghitungan secara paralel (terutama bila server memiliki 32 core). Untuk tujuan tersebut saya menemukan paket DBMS_SCHEDULER yang berguna:

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;
/

Namun saya tidak tahu bagaimana menunggu pekerjaan selesai sebelum pesan pekerjaan selesai...

Melakukan polling scheduler_jobs secara terus-menerus adalah solusi yang tidak efisien, namun ini hanya satu-satunya solusi yang ada dalam pikiran Anda. Pencarian dan dokumen resmi tidak memberikan solusi yang relevan.


person gavenkoa    schedule 01.07.2013    source sumber
comment
menciptakan pekerjaan tidak meluncurkannya. Sepertinya Anda menginginkan RANTAI PEKERJAAN, di mana Anda dapat menjalankan banyak langkah (pekerjaan) dalam urutan tertentu (atau secara bersamaan). Saya terlalu sibuk untuk memberikan banyak kode, tetapi lihat di sini sebagai contoh   -  person tbone    schedule 01.07.2013
comment
@tbone terima kasih atas minat +1   -  person gavenkoa    schedule 02.07.2013


Jawaban (1)


Pekerjaan tidak digunakan untuk paralelisme (setidaknya bukan itu tujuan untuk). Pekerjaan digunakan untuk menjalankan prosedur pada waktu dan jadwal tertentu. Jadi Anda tidak memulai suatu pekerjaan dan menunggu sampai selesai.

Bagaimanapun, yang Anda lakukan adalah menciptakan pekerjaan tetapi jangan pernah memintanya untuk mulai berjalan. Anda harus menelepon dbms_scheduler.run_job( job_name => job1 ) untuk melakukan itu. Panggilan itu akan segera kembali dan pekerjaan Anda yang sudah berjalan lama akan terus berjalan di latar belakang.

Jika saya memahami pertanyaan Anda dengan benar, yang Anda coba lakukan adalah memecah beberapa perhitungan rumit dan menjalankannya secara paralel, tetapi tidak harus menjalankannya berulang kali sesuai jadwal. Yang Anda inginkan adalah DBMS_PARALLEL_EXECUTE, tempat Anda memecahkan sebagian besar kerjakan menjadi beberapa bagian berdasarkan beberapa kriteria dan jalankan secara individual.

person eaolson    schedule 24.07.2013