İfadelerin yürütülme hızı neden ağ bağlantısına bağlıdır?


31

T-SQL yürütme hızı, sunucuya karşı ağ bağlantısının gecikmesine bağlıdır. SQL Server'ın müşteriye geri bildireceği bir şey yoksa, yapılana kadar çalışacağını, ancak sınamanın başka bir hikaye gösterdiğini varsaydım.

create procedure UselessLoop
  @I int
as
declare @D datetime = getdate()
while @I > 0 set @I -= 1
print datediff(millisecond, @D, getdate())

exec UselessLoop 100000

Server    Milliseconds
local     53
nearby    63
faraway   660

exec UselessLoop 1000000

Server    Milliseconds
local     546
nearby    640
faraway   6183

Sınamalar, aynı sunucuya karşı SSMS kullanan farklı bilgisayarlardan gerçekleştirilir. Yerel sunucudan yürütülür, yakındaki aynı yerel ağdadır ve uzak, 500 km uzaklıktaki 1 gigabit lifi ile bağlı başka bir ofisten uzaklaşır.

Açıkça, SQL Server ile istemci arasında doğrudan yürütülen ifade sayısına bağlı olan bir iletişim olduğu açık.

Taşınan şeye bakmak için Wireshark kullandım ve bu kadarını anladığımı söyleyemem ama 22740 paket içinde toplam 26 MB alışveriş yapan bir tcp.

Bunun yerine işe yaramaz bir fonksiyona ne dersiniz?

create function dbo.UDFUselessLoop(@I int)
returns int
as
begin
  declare @D datetime = getdate()
  while @I > 0 set @I -= 1
  return datediff(millisecond, @D, getdate())
end

print dbo.UDFUselessLoop(1000000)

Nerede yapıldığına bakılmaksızın 406 milisaniyede çalıştırılır. Döngüdeki müşteri ile iletişim yok gibi görünüyor.


3
Benim sorum da bu cevaba bakın lütfen stackoverflow.com/a/1547539
gbn

Yanıtlar:


33

Açıkça, SQL Server ile istemci arasında doğrudan yürütülen ifade sayısına bağlı olan bir iletişim olduğu açık.

Evet var. Varsayılan olarak, SQL Server saklı yordamdaki her ifadeden sonra bir TDS DONE_IN_PROCmesajı gönderir . Mesaj, tamamlanan cümleyle ilgili durum ve satır sayısı bilgilerini müşteriye iletir.

T-SQL komutunu kullanarak bu mesajların gönderilmesini engelleyebilirsiniz:

SET NOCOUNT ON;

Aşağıda, bu komut için Çevrimiçi Kitaplar girişinden bir alıntı (benim vurgulamam) :

Çok fazla gerçek veri döndürmeyen birkaç ifade içeren saklı yordamlar veya Transact-SQL döngüleri içeren yordamlar için, SET NOCOUNT değerini ON olarak ayarlamak, ağ trafiğinin büyük ölçüde azalması nedeniyle önemli bir performans artışı sağlayabilir.

İlgili Soru ve Cevap: Basit bir döngü neden ASYNC_NETWORK_IO'nun beklemesine neden oluyor?

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.