Apakah melepaskan WAITFOR tanpa batas meningkatkan ukuran file log?

16

Dalam rilis terakhir aplikasi saya, saya menambahkan perintah yang memerintahkannya untuk menunggu ketika sesuatu tiba dalam antrian Broker Layanan:

WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)

DBA memberi tahu saya bahwa sejak penambahan, ukuran log telah melewati atap. Mungkinkah ini benar? Atau haruskah saya mencari di tempat lain?

AngryHacker
sumber

Jawaban:

17

Setiap transaksi terbuka aktif akan menyematkan log, mencegah pemotongan dan akhirnya menyebabkan pertumbuhan. Jika Anda memulai transaksi, menulis ke log dan kemudian menunggu selamanya dengan harapan sebuah pesan pada akhirnya akan membangunkan Anda, Anda hanya menyematkan log dan membuatnya tumbuh.

Akhir-akhir ini saya mulai merekomendasikan orang untuk menghindari WAITFOR dalam prosedur yang diaktifkan, bersama dengan loop. Cukup keluarkan PENERIMA dan lakukan, biarkan loop mekanisme aktivasi untuk Anda (itu) dan jangan menunggu, hanya MENERIMA.

Rasa WAITFOR dari RECEIVE menciptakan savepoint secara internal. Ini menghasilkan log (setidaknya 3 catatan log) dan memang menyematkan log di tempat sambil menunggu. Memiliki waktu tunggu WAITFOR yang lama (atau lebih buruk, yang tak terbatas) akan menjadi praktik yang sangat buruk.

Remus Rusanu
sumber
1
Apakah akan WAITFOR (...) TIMEOUT 3600000menyelesaikan masalah? Misalnya rilis setiap jam.
AngryHacker
2
Log Anda akan tumbuh banyak dalam satu jam. WAITFOR (REC EIVE) dimaksudkan untuk interval seperti 5 detik ...
Remus Rusanu
1
Anda juga harus menyelidiki mengapa transaksi Anda sebenarnya aktif (memiliki log tertulis). Pola Pialang Layanan biasanya tidak menerbitkan penulisan sebelum PENERIMAAN.
Remus Rusanu
1
Saya tidak mengerti komentar terakhir Anda. Transaksi aktif karena saya mengeluarkan a WAITFOR (RECEIVE...Bisakah Anda memperluas? Mungkin, saya salah paham.
AngryHacker
8
begin transaction; waitfor(receive...)tidak akan menghasilkan catatan log apa pun (tidak akan 'mengaktifkan' transaksi) sambil menunggu, dan dengan demikian tidak akan menyematkan log. Hanya begin transaction;[insert|update|delete];waitfor(receive...)akan menyebabkan transaksi untuk 'mengaktifkan' (menghasilkan catatan log) dan dengan demikian akan benar-benar pin log sambil menunggu.
Remus Rusanu
5

Pada SQL Server 2008 R2, jika saya menjalankan WAITFOR (RECEIVE), kemudian menjalankan DBCC OPENTRAN, itu menunjukkan transaksi sebagai aktif, bahkan tanpa adanya pembaruan sebelumnya.

Nigel Pattinson
sumber
2
Benar, WAITFOR membuat savepoint secara internal dan ini memicu penulisan log sehingga tidak menyematkan log.
Remus Rusanu
@RemusRusanu bukankah itu bertentangan dengan komentar Anda sebelumnya pada jawaban yang lain ?
binki
@binki yang merujuk komentar ke SQL Server 2005. Ini untuk 2008 R2. Mereka berperilaku berbeda sehubungan dengan masalah ini, jika saya ingat dengan benar.
Remus Rusanu