Kami memiliki prosedur tersimpan yang dapat dijalankan pengguna secara manual untuk mendapatkan nomor yang diperbarui untuk laporan yang digunakan terus-menerus sepanjang hari.
Saya memiliki prosedur tersimpan kedua yang harus dijalankan setelah prosedur tersimpan pertama dijalankan karena didasarkan pada angka yang diperoleh dari prosedur tersimpan pertama ini, namun itu membutuhkan waktu lebih lama untuk dijalankan dan untuk proses yang terpisah, jadi saya tidak ingin membuat pengguna menunggu saat prosedur tersimpan ke-2 ini dijalankan.
Apakah ada cara agar satu prosedur tersimpan memulai prosedur tersimpan kedua, dan segera kembali tanpa menunggu hasil?
Saya menggunakan SQL Server 2005.
Jawaban:
Sepertinya ada beberapa cara untuk melakukan ini, tetapi saya menemukan cara paling sederhana adalah saran Martin untuk mengatur prosedur dalam pekerjaan SQL, dan memulainya menggunakan perintah sp_start_job asynchronous dari prosedur tersimpan saya.
Ini hanya berfungsi untuk saya karena saya tidak perlu menentukan parameter apa pun untuk prosedur tersimpan saya.
Saran lain yang dapat bekerja tergantung pada situasi Anda
Menjalankan proses secara asinkron dalam kode yang bertanggung jawab untuk menjalankan prosedur tersimpan, seperti yang disarankan Mr.Brownstone .
Bukan ide yang buruk, namun dalam kasus saya prosedur tersimpan dipanggil dari beberapa tempat, jadi menemukan semua tempat itu dan memastikan mereka memanggil prosedur ke-2 juga tampaknya tidak praktis. Juga, prosedur 2 yang disimpan cukup kritis, dan lupa menjalankannya dapat menyebabkan beberapa masalah besar bagi perusahaan kami.
sumber
EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.
Pialang Layanan juga, atau Agen Sql, ada di Azure. Saya tidak tahu mengapa Microsoft, setelah satu setengah dekade orang bertanya, menolak untuk menambahkanEXECUTE ASYNC RematerializeExpensiveCacheTable
.Anda dapat menggunakan broker layanan bersama dengan aktivasi di antrian. Dengan itu Anda dapat memposting parameter untuk panggilan prosedur pada antrian. Itu membutuhkan waktu sebanyak sisipan. Setelah transaksi dilakukan dan berpotensi beberapa detik lagi, aktivasi akan secara otomatis memanggil prosedur penerima secara tidak sinkron. Daripada hanya harus mengambil parameter antrian dan melakukan pekerjaan yang diinginkan.
sumber
Pertanyaan lama ini layak mendapat jawaban yang lebih komprehensif. Beberapa di antaranya disebutkan dalam jawaban / komentar lain di sini, yang lain mungkin atau mungkin tidak bekerja untuk situasi spesifik OP, tetapi mungkin bekerja untuk orang lain yang mencari memanggil procs yang disimpan secara asinkron dari SQL.
Secara eksplisit: TSQL tidak (dengan sendirinya) memiliki kemampuan untuk meluncurkan operasi TSQL lainnya secara tidak sinkron .
Itu tidak berarti Anda masih tidak memiliki banyak opsi:
sp_start_job
. Jika Anda perlu memantau progresnya secara programatis, pastikan masing-masing pekerjaan memperbarui tabel JOB_PROGRESS khusus (atau Anda dapat memeriksa apakah mereka telah selesai menggunakan fungsi tidak berdokumenxp_sqlagent_enum_jobs
seperti dijelaskan dalam artikel yang sangat bagus ini oleh Gregory A. Larsen). Anda harus membuat pekerjaan terpisah sebanyak yang Anda inginkan untuk menjalankan proses paralel, bahkan jika mereka menjalankan proc tersimpan yang sama dengan parameter yang berbeda.sp_oacreate
dansp_oamethod
untuk meluncurkan proses baru memanggil masing-masing proc tersimpan lainnya seperti yang dijelaskan dalam artikel ini , juga oleh Gregory A. Larsen.Parallel_AddSql
danParallel_Execute
seperti yang dijelaskan dalam artikel ini oleh Alan Kaplan (SQL2005 + saja).Jika itu saya, saya mungkin akan menggunakan beberapa SQL Agent Jobs dalam skenario yang lebih sederhana, dan paket SSIS dalam skenario yang lebih kompleks.
Dalam kasus Anda, memanggil pekerjaan SQL Agent terdengar seperti pilihan yang sederhana dan mudah dikelola.
Satu komentar terakhir : SQL sudah mencoba untuk memparalelkan operasi individual kapan saja *. Ini berarti menjalankan 2 tugas pada saat yang sama alih-alih setelah satu sama lain bukan jaminan bahwa itu akan selesai lebih cepat. Uji dengan cermat untuk melihat apakah itu benar-benar meningkatkan sesuatu atau tidak.
Kami memiliki pengembang yang membuat paket DTS untuk menjalankan 8 tugas secara bersamaan. Sayangnya, itu hanya server 4-CPU :)
* Dengan asumsi pengaturan default. Ini dapat dimodifikasi dengan mengubah Derajat Maksimal Paralelisme atau Topeng Affinity server, atau dengan menggunakan petunjuk permintaan MAXDOP.
sumber
Ya, satu metode:
sumber
sp_start_job
untuk memulainya atau menciptakan pekerjaan yang diperlukan secara dinamis untuk menghindari polling setiap menit, tetapi kompleksitas untuk kasus itu mungkin berarti itu tidak akan lebih sederhana daripada broker layanan.sp_start_job
segera kembali. Tidak dapat mengingat izin apa yang dibutuhkan.Kemungkinan lain adalah membuat prosedur tersimpan ke-1 untuk menulis ke meja audit ketika selesai dan menempatkan pemicu di atas meja audit yang meluncurkan prosedur tersimpan ke-2 saat tabel audit ditulis. Tidak perlu terus-menerus melakukan jajak pendapat dan tidak perlu pekerjaan agen SQL Server tambahan.
sumber
INSERT
atauUPDATE
, tidak asinkron, sehingga Martin benar bahwa prosedur 1 masih akan berakhir menunggu sampai prosedur 2 selesai kembali.