Sepertinya kecepatan mengeksekusi T-SQL tergantung pada latensi koneksi jaringan terhadap server. Saya berasumsi bahwa jika SQL Server tidak memiliki apa pun untuk dilaporkan kembali ke klien, itu hanya akan mengeksekusi sampai selesai tetapi pengujian menunjukkan cerita lain.
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
Pengujian dijalankan terhadap server yang sama dari komputer yang berbeda menggunakan SSMS. Lokal dijalankan dari Server, di dekatnya ada di jaringan lokal yang sama dan jauh dieksekusi dari kantor lain yang berjarak 500 km terhubung dengan 1 gigabit fiber.
Jelas ada beberapa komunikasi yang terjadi antara SQL Server dan klien yang secara langsung tergantung pada jumlah pernyataan yang dieksekusi.
Saya menggunakan Wireshark untuk melihat apa yang diangkut dan saya tidak bisa mengatakan bahwa saya mengerti banyak tetapi itu adalah tcp.stream yang menukar total 26 MB dalam paket 22740.
Bagaimana dengan fungsi yang tidak berguna?
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)
Itu dijalankan dalam 406 milidetik terlepas dari mana itu dieksekusi. Sepertinya tidak ada komunikasi dengan klien di loop.
sumber
Jawaban:
Ya ada. Secara default, SQL Server mengirim pesan TDS
DONE_IN_PROC
setelah setiap pernyataan dalam prosedur tersimpan. Pesan mengkomunikasikan informasi status dan jumlah baris untuk pernyataan yang diselesaikan kepada klien.Anda dapat menekan pengiriman pesan ini menggunakan perintah T-SQL:
Berikut ini adalah kutipan (penekanan saya) dari entri Books Online untuk perintah ini:
T & J Terkait: Mengapa loop sederhana menghasilkan ASYNC_NETWORK_IO menunggu?
sumber