ऐसा लगता है कि T-SQL निष्पादित करने की गति सर्वर के खिलाफ नेटवर्क कनेक्शन की विलंबता पर निर्भर है। मैंने यह मान लिया कि यदि SQL सर्वर के पास क्लाइंट के बारे में रिपोर्ट करने के लिए कुछ भी नहीं है, तो इसे तब तक निष्पादित किया जाएगा जब तक कि यह पूरा न हो जाए लेकिन परीक्षण एक और कहानी दिखाता है।
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
एसएसएमएस का उपयोग करके विभिन्न कंप्यूटरों से एक ही सर्वर के खिलाफ परीक्षण निष्पादित किए जाते हैं। स्थानीय सर्वर से निष्पादित किया जाता है, पास में एक ही स्थानीय नेटवर्क पर है और दूर से 1 गीगाबिट फाइबर के साथ जुड़े 500 किमी दूर एक अन्य कार्यालय से निष्पादित किया जाता है।
SQL सर्वर और क्लाइंट के बीच स्पष्ट रूप से कुछ संचार चल रहा है जो सीधे निष्पादित किए गए बयानों की संख्या पर निर्भर है।
मैंने जो ट्रांसपोर्ट किया है, उसे देखने के लिए मैंने विर्सार्क का इस्तेमाल किया और मैं यह नहीं कह सकता कि मैं इतना समझता हूं लेकिन यह एक tcp.stream था जो 22740 पैकेट में कुल 26 एमबी का आदान-प्रदान करता था।
इसके बजाय एक बेकार फ़ंक्शन के बारे में कैसे?
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 मिलीसेकंड में निष्पादित होता है, भले ही यह कहाँ से निष्पादित किया गया हो। ऐसा लगता है कि लूप में क्लाइंट के साथ कोई संचार नहीं है।