SET NOCOUNT ON Neden Bu Kadar Önemli?
Bir stored procedure’ün ilk satırında SET NOCOUNT ON; ifadesini görüp neden orada olduğunu merak ettiyseniz, bu yazı tam size göre. Küçük bir ayar gibi görünse de doğru kullanıldığında ağ trafiğinden istemci tarafındaki işlem yüküne kadar birçok yerde fark yaratan bir T-SQL alışkanlığından bahsediyoruz.
SET NOCOUNT Nedir, Ne İşe Yarar?
SQL Server varsayılan olarak SET NOCOUNT OFF; ile çalışır. Bu durumda her ifadenin ardından istemciye “(10 rows affected)” gibi etkilenen satır sayısını bildiren bir mesaj gönderilir. SET NOCOUNT ON; ise bu mesajları bastırır; yani SQL Server artık her UPDATE, INSERT veya DELETE sonrası bu bilgilendirme mesajını iletmez.
Örneğin bir UPDATE 10 satırı değiştirdiğinde NOCOUNT OFF ile “(10 rows affected)” mesajı iletilirken, NOCOUNT ON ile herhangi bir satır sayısı mesajı gönderilmez.
Uygulama Geliştirici Perspektifi
.NET veya Entity Framework tabanlı bir uygulamada bu etkilenen satır mesajları genellikle görmezden gelinir. Uygulama kodu çoğunlukla dönen veriyle, output parametrelerle, return değerleriyle ya da açıkça döndürülmüş bir satır sayısıyla ilgilenir. Dolayısıyla kullanılmayan bu mesajları bastırmak; SQL Server, ağ ve istemci tarafında gereksiz iş yükünü azaltabilir.
Dikkat edilmesi gereken bir istisna var: SqlCommand.ExecuteNonQuery() kullanan kod, NOCOUNT etkinken etkilenen satır sayısı yerine -1 değeri alabilir. Uygulamanız gerçek satır sayısına ihtiyaç duyuyorsa @@ROWCOUNT değerini açıkça döndürmeniz gerekir.
Basit Bir Örnek
Aşağıdaki stored procedure eski siparişleri kapatır ve güncellenen satır sayısını döner:
CREATE PROCEDURE dbo.CloseOldOrders AS
BEGIN
SET NOCOUNT ON;
UPDATE dbo.Orders
SET Status = 'Closed'
WHERE ShipDate < GETDATE();
SELECT @@ROWCOUNT AS RowsUpdated;
END;
SET NOCOUNT ON; burada UPDATE işlemini engellemez, SELECT sonucunu bastırmaz, @@ROWCOUNT değerini devre dışı bırakmaz ve procedure’ün nihai sonucunu değiştirmez. Sadece ek olarak gönderilen “etkilenen satır” mesajını susturur.
Ölçekte Anlam Kazanan Bir Kazanım
Tek bir ifadedeki tasarruf küçüktür; ancak bu küçük tasarruflar birikir. 20 ifadeden oluşan bir procedure 100.000 kez çağrıldığında, yaklaşık 2 milyon gereksiz satır sayısı protokol token’ı elenebilir. Bu token’lar ağ paketlerini paylaşabilir olsa da yine de işlem yüküne yol açar. Döngüler, tetikleyiciler, çoklu güncellemeler ve iç içe procedure çağrıları bu sayıyı daha da büyütebilir. Bunları ortadan kaldırmak; ağ trafiğini, istemci tarafı işlem yükünü, gecikmeyi ve hesaplama tüketimini düşürebilir.
İç İçe Procedure’lerde Davranış
Bir stored procedure başka bir procedure çağırdığında, çağrılan procedure kendisi değiştirmedikçe mevcut NOCOUNT ayarı geçerli olmaya devam eder. İç procedure geri döndüğünde SQL Server, çağıran procedure’ün önceki ayarını yeniden geçerli kılar. Buna rağmen her procedure’ün kendi başına davranışının net ve bağımsız olması için SET NOCOUNT ON; ifadesini içermesi önerilir.
Transaction’lar İçinde Güvenli mi?
SET NOCOUNT ON; bir transaction içinde kullanıldığında kilitlemeyi, commit’i, rollback’i veya hata yönetimini etkilemez. Yalnızca etkilenen satır mesajlarının gönderilip gönderilmeyeceğini kontrol eder.
CREATE PROCEDURE dbo.CloseOrder
@OrderId int
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION;
UPDATE dbo.Orders
SET Status = 'Closed'
WHERE OrderId = @OrderId;
INSERT INTO dbo.OrderHistory (OrderId, Status)
VALUES (@OrderId, 'Closed');
COMMIT;
SELECT @OrderId AS OrderId, 'Closed' AS Status;
END;
NOCOUNT OFF ile bu procedure, nihai sipariş durumunu döndürmeden önce iki adet etkilenen satır mesajı iletir. NOCOUNT ON ile ise yalnızca nihai sipariş durumunu döner. Transaction her iki durumda da tıpatıp aynı şekilde davranır; NOCOUNT yalnızca uygulamanın büyük olasılıkla göz ardı edeceği ara mesajları engeller.
Nelerin Bastırılmadığına Dikkat
SET NOCOUNT ON; yalnızca etkilenen satır mesajlarını susturur. PRINT veya RAISERROR tarafından üretilen mesajları bastırmaz. Ayrıca SELECT ile döndürülen sonuç kümelerini de etkilemez. Yani asıl veriniz her koşulda istemciye ulaşır; sadece protokol düzeyindeki bilgilendirme mesajları elenir.
Sonuç
SET NOCOUNT ON; küçük ama gerçek bir faydası olan bir alışkanlıktır..NET uygulamalarınızın genellikle ihtiyaç duymadığı mesajları kaldırır, gereksiz işi azaltır ve stored procedure davranışını daha öngörülebilir kılar. Bu mesajlara özel bir ihtiyacınız yoksa çoğu procedure için varsayılan tercihiniz olması mantıklıdır.







Yorum gönder