ดูเหมือนว่าความเร็วในการดำเนินการ T-SQL นั้นขึ้นอยู่กับเวลาแฝงของการเชื่อมต่อเครือข่ายกับเซิร์ฟเวอร์ ฉันสันนิษฐานว่าถ้า SQL Server ไม่มีอะไรจะรายงานกลับไปยังไคลเอนต์เกี่ยวกับมันก็จะดำเนินไปจนกว่าจะเสร็จ แต่การทดสอบแสดงให้เห็นอีกเรื่องหนึ่ง
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
การทดสอบจะดำเนินการกับเซิร์ฟเวอร์เดียวกันจากคอมพิวเตอร์ที่แตกต่างกันโดยใช้ SSMS Local ดำเนินการจากเซิร์ฟเวอร์บริเวณใกล้เคียงอยู่ในเครือข่ายท้องถิ่นเดียวกันและมีการดำเนินการที่ห่างไกลจากสำนักงานอื่น 500 กม. ซึ่งเชื่อมต่อกับ 1 กิกะบิตไฟเบอร์
เห็นได้ชัดว่ามีการสื่อสารบางอย่างเกิดขึ้นระหว่าง SQL Server และไคลเอนต์ที่ขึ้นอยู่กับจำนวนของคำสั่งที่เรียกใช้โดยตรง
ฉันใช้ Wireshark เพื่อดูสิ่งที่ขนส่งและฉันไม่สามารถพูดได้ว่าฉันเข้าใจมาก แต่มันเป็นการแลกเปลี่ยน tcp.stream จำนวน 26 MB ในแพ็คเก็ต 22740
ฟังก์ชั่นที่ไร้ประโยชน์แทนได้อย่างไร?
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)
มันดำเนินการใน 406 มิลลิวินาทีโดยไม่คำนึงถึงว่ามันจะถูกดำเนินการจากที่ใด ดูเหมือนว่าไม่มีการสื่อสารกับลูกค้าในลูป