Apakah saya memerlukan "waktu henti" untuk memperbarui prosedur yang tersimpan? (Karena kesalahan "definisi berubah")

8

Saya selalu berpikir bahwa memperbarui prosedur tersimpan adalah sesuatu yang bisa saya lakukan ketika pengguna aktif menggunakan sistem.

Tapi saya saat ini sedang menguji pembaruan untuk prosedur yang tersimpan dan sementara panggilan berjalan lama ke sproc sedang dieksekusi (itu 4 + menit ke dalam panggilan), saya memperbarui sproc. (Saya berencana untuk mencoba rencana kueri yang berbeda di jendela terpisah.)

Ketika saya kembali ke yang lama berjalan, saya memiliki kesalahan ini:

The definition of object 'MySprocName' has changed since it was compiled.

Kesalahan ini tampaknya mengatakan bahwa setiap sproc yang sedang dieksekusi secara aktif akan gagal jika definisi sproc itu diperbarui. (Saya berpikir bahwa sekali sproc mulai berjalan, ia akan menggunakan rencana itu untuk sisa menjalankan meskipun perubahan definisi.)

Apakah ini benar? Apakah saya perlu memiliki waktu henti untuk memperbarui definisi sproc?

Gunung berapi
sumber
3
Apakah prosedur tersimpan menyimpan bagian dari transaksi yang lebih besar? Apakah ada kode yang mengeluarkan kunci skema pada apa pun? Secara teori perubahan itu seharusnya diblokir. Bisakah Anda menjelaskan lebih rinci tentang apa yang dilakukan prosedur dan apa yang menjadi bagian dari prosedur tersebut?
Aaron Bertrand
@ Harun Bertrand - itu adalah sproc yang cukup jinak. Ini memiliki beberapa panggilan top pilih. Tidak ada kunci atau hal lain seperti itu. Satu-satunya hal yang penting adalah bahwa ia memiliki beberapa pernyataan "jika" berdasarkan parameter. Proses kueri yang sebenarnya bervariasi sedikit berdasarkan parameter. Ini dipanggil dari layanan .net.
Vaccano
2
Prosedur "cukup jinak" seharusnya tidak memakan waktu empat menit untuk dijalankan. Apa yang dilakukannya selama ini?
Aaron Bertrand
Sudahkah Anda mencoba mengubah proc <proc Name> WITH RECOMPILE? Ini adalah opsi tingkat prosedur untuk mengatur prosedur untuk dikompilasi ulang setelah setiap kali dijalankan. Ini berarti bahwa rencana akan selalu mengkompilasi ulang sehingga menghindari rencana cache digunakan kembali.
MarmiK
dba.stackexchange.com/questions/154939/... Sudahkah Anda melihat pertanyaan ini?
k010mb0

Jawaban:

1

Ya memang benar bahwa Anda tidak boleh mengubah prosedur tersimpan yang aktif berjalan, karena SQL Server tidak menyukainya.

Sedangkan untuk mengambil downtime, ya, Anda tidak harus membuat perubahan pada prosedur tersimpan yang sering digunakan dalam lingkungan produksi yang sibuk selama jam operasional sebagai praktik terbaik.

Randolph Barat
sumber