ทำไมความเร็วในการดำเนินการคำสั่งขึ้นอยู่กับการเชื่อมต่อเครือข่าย?


31

ดูเหมือนว่าความเร็วในการดำเนินการ 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 มิลลิวินาทีโดยไม่คำนึงถึงว่ามันจะถูกดำเนินการจากที่ใด ดูเหมือนว่าไม่มีการสื่อสารกับลูกค้าในลูป


3
ดูคำตอบนี้สำหรับคำถามของฉันด้วยเช่นกันกรุณาstackoverflow.com/a/1547539
gbn

คำตอบ:


33

เห็นได้ชัดว่ามีการสื่อสารบางอย่างเกิดขึ้นระหว่าง SQL Server และไคลเอนต์ที่ขึ้นอยู่กับจำนวนของคำสั่งที่เรียกใช้โดยตรง

ใช่แล้ว โดยค่าเริ่มต้น SQL Server ส่งข้อความTDSDONE_IN_PROCหลังจากทุกคำสั่งในกระบวนงานที่เก็บไว้ ข้อความสื่อสารสถานะและข้อมูลการนับแถวสำหรับคำสั่งที่สมบูรณ์ไปยังไคลเอนต์

คุณสามารถระงับการส่งข้อความเหล่านี้โดยใช้คำสั่ง T-SQL:

SET NOCOUNT ON;

ต่อไปนี้เป็นสารสกัด (เน้นของฉัน) จากรายการหนังสือออนไลน์สำหรับคำสั่งนี้:

สำหรับกระบวนงานที่เก็บไว้ซึ่งประกอบด้วยหลายคำสั่งที่ไม่ส่งคืนข้อมูลจริงมากหรือสำหรับกระบวนงานที่มีการวนรอบ Transact-SQL การตั้งค่า SET NOCOUNT เป็น ON สามารถให้ประสิทธิภาพที่สำคัญเนื่องจากการรับส่งข้อมูลเครือข่ายลดลงอย่างมาก

คำถาม & คำตอบที่เกี่ยวข้อง: เหตุใดการวนรอบอย่างง่ายใน ASYNC_NETWORK_IO จึงรออยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.