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.