नेटवर्क कनेक्शन पर निष्पादित बयानों की गति क्यों निर्भर है?


31

ऐसा लगता है कि 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 मिलीसेकंड में निष्पादित होता है, भले ही यह कहाँ से निष्पादित किया गया हो। ऐसा लगता है कि लूप में क्लाइंट के साथ कोई संचार नहीं है।


3
मेरे प्रश्न का यह उत्तर भी देखें stackoverflow.com/a/1547539
gbn

जवाबों:


33

SQL सर्वर और क्लाइंट के बीच स्पष्ट रूप से कुछ संचार चल रहा है जो सीधे निष्पादित किए गए बयानों की संख्या पर निर्भर है।

हाँ वहाँ है। डिफ़ॉल्ट रूप से, SQL सर्वर संग्रहीत कार्यविधि में प्रत्येक कथन के बाद एक टीडीएस DONE_IN_PROCसंदेश भेजता है । संदेश क्लाइंट को पूर्ण विवरण के लिए स्थिति और पंक्ति गणना जानकारी का संचार करता है।

आप T-SQL कमांड का उपयोग करके इन संदेशों के भेजने को दबा सकते हैं:

SET NOCOUNT ON;

इस आदेश के लिए पुस्तकें ऑनलाइन प्रविष्टि से एक उद्धरण (मेरा जोर) है :

संग्रहीत कार्यविधियों के लिए, जिसमें कई कथन होते हैं जो बहुत वास्तविक डेटा नहीं लौटाते हैं, या उन प्रक्रियाओं के लिए, जिनमें Transact-SQL लूप शामिल हैं, SET NOCOUNT को ON सेट करने से एक महत्वपूर्ण प्रदर्शन को बढ़ावा मिल सकता है, क्योंकि नेटवर्क ट्रैफ़िक बहुत कम हो जाता है।

संबंधित प्रश्नोत्तर: ASYNC_NETWORK_IO प्रतीक्षा में एक साधारण लूप क्यों होता है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.