Belirsiz bir WAITFOR'u tetiklemek günlük dosyasının boyutunu artırır mı?


16

Uygulamamın son sürümünde, Service Broker kuyruğuna bir şey geldiğinde beklemesini söyleyen bir komut ekledim:

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

DBA'lar bana eklemeden beri kütük boyutlarının çatıdan geçtiğini söylüyor. Bu doğru olabilir mi? Yoksa başka bir yere mi bakmalıyım?

Yanıtlar:


17

Herhangi bir aktif açık işlem günlüğü sabitler, kesmeyi önler ve sonunda büyümeye neden olur. Bir işleme başlarsanız, günlüğe yazın ve sonsuza kadar bir mesajın sizi uyandıracağını umarak bekleyin, sadece günlüğü tuttunuz ve büyümesine neden oldunuz.

Son zamanlarda insanlara döngü ile birlikte aktif prosedürde WAITFOR'u kapatmalarını tavsiye etmeye başladım. Sadece bir RECIEVe yayınlayın ve tamamlayın, aktivasyon mekanizmasının sizin için dönmesine izin verin (öyle) ve WAITFOR'u kullanmayın, sadece düz ALIN.

RECEIVE'ın WAITFOR aroması, dahili olarak bir kayıt noktası yaratır. Bu günlük oluşturur (en az 3 günlük kaydı) ve gerçekten beklerken günlüğü sabitler. Uzun bir WAITFOR zaman aşımı (veya daha kötüsü, sonsuz bir zaman aşımı) olması çok kötü bir uygulama olacaktır.


1
WAITFOR (...) TIMEOUT 3600000Sorunu çözer misiniz ? Örneğin saatlik yayın.
AngryHacker

2
Günlüğünüz bir saat içinde çok büyüyecek . WAITFOR (REC EIVE) 5 saniye gibi süreler içindir ...
Remus Rusanu

1
Ayrıca işleminizin gerçekte neden etkin olduğunu (günlüğü yazdı) araştırmalısınız. Tipik Servis Aracısı deseni ALICI'dan önce herhangi bir yazma işlemi gerçekleştirmez.
Remus Rusanu

1
Son yorumunu anlamıyorum. Bir etkinleştirme WAITFOR (RECEIVE...yapabilir misiniz yayınladığım için işlem etkin. Belki de yanlış anladım.
AngryHacker

8
begin transaction; waitfor(receive...)beklerken herhangi bir günlük kaydı oluşturmaz (işlemi 'etkinleştirmez') ve böylece günlüğü sabitlemez. Yalnızca begin transaction;[insert|update|delete];waitfor(receive...)işlemin 'etkinleşmesine' (günlük kayıtları oluşturmasına) neden olur ve böylece beklerken günlüğü sabitler.
Remus Rusanu

5

SQL Server 2008 R2'de, bir WAITFOR (RECEIVE) çalıştırır ve DBCC OPENTRAN'ı çalıştırırsam, önceki güncellemelerin yokluğunda bile işlemi etkin olarak gösterir.


2
Doğru, WAITFOR dahili olarak bir kayıt noktası oluşturur ve bu, günlüğü yazma işlemini tetikler, böylece günlüğü yerine sabitler.
Remus Rusanu


@binki bu yorum SQL Server 2005 içindir. Bu 2008 R2 içindir. Doğru hatırlarsam, bu konuda farklı davranırlar.
Remus Rusanu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.