การดำเนินการตามคำขอเดียวกันจาก C # VS SSMS ให้เวลาดำเนินการที่แตกต่างกัน


12

ฉันมีคำขอเช่นนี้

SELECT 
[EstimateId], 
[CreationUserId], 
[EstimateStatusValueId], 
[LanguageId], 
[LocationId], 
[EstimatorUserId], 
[FilterUnitSystemTypeId], 
[EstimateNumber], 
[RevisionNumber], 
[CreationDate], 
[ModificationDate], 
[ProjectDescription], 
[IsBsdq], 
[ClosingDate], 
[ClosingTime], 
[ClosingUpdatedOn], 
[DeadLineDate], 
[IsReceived], 
[Inclusion], 
[Exclusion], 
[Misc], 
[Note], 
[WorkDeadLines], 
[Comments], 
[Validity], 
[PlansLocation], 
[PlansReceivedFrom], 
[Price]
FROM [Estimate].[Estimates] 
ORDER BY [ClosingDate] ASC, [ClosingTime] ASC

เมื่อฉันเรียกใช้แบบสอบถามนี้ใน SSMS ฉันได้รับเวลาดำเนินการ 953ms แต่เมื่อฉันเรียกใช้แบบสอบถามนี้จากแบบสอบถาม Linq ใน C # ของฉันฉันได้รับเวลาดำเนินการ 1813ms

The Linq Query ใช้ ".Net SqlClient Data Provider" และใช้กับ EntityFramework (ไฟล์ EDMX) นี่อาจเป็นปัญหาหรือไม่?

ไม่มีใครรู้ว่าทำไมฉันถึงมีความแตกต่างอย่างมากระหว่างเวลาดำเนินการของคำขอเหล่านั้นที่เหมือนกัน แต่ดำเนินการจากบริบทที่แตกต่างกับฐานข้อมูลเดียวกัน

ฉันตรวจสอบแผนการดำเนินการทั้งหมดของคำขอทั้งสองและพวกเขาใช้ดัชนีเดียวกันเพื่อตอบคำถามของพวกเขา

หากต้องการดูแผนการดำเนินการของคำขอ C # ฉันใช้ SQL profiler เพื่อดักจับเหตุการณ์ Show Plan XML และเปรียบเทียบกับหนึ่งใน SSMS และทั้งคู่เหมือนกัน


แค่คำถามเล็ก ๆ - ทำไมคุณถึงเลือกข้อมูลทั้งหมดของตารางโดยไม่มีเงื่อนไขการค้นหา? คุณต้องการข้อมูลทั้งหมดในแอปพลิเคชันโดยไม่ต้องมีการกรองหรือไม่?
Marian

ใช่นี่เป็นคุณสมบัติที่ฉันต้องการ แต่ฟีเจอร์นี้จะไม่สามารถใช้งานได้บ่อย ฉันรู้ว่ามันไม่เหมาะที่จะออกแบบสอบถามขนาดใหญ่โดยไม่มีข้อ
Nico

อย่างไรก็ตามความกังวลของฉันไม่ใช่คำขอ แต่เป็นความแตกต่างระหว่างเวลาดำเนินการ ฉันแสดงข้อความค้นหานี้ให้คุณ แต่ข้อความค้นหาทั้งหมดให้ผลลัพธ์ที่คล้ายกัน ทำไม
นิโก้

คำตอบ:


6

สิ่งนี้สอดคล้องกันเป็นครั้งคราวหรือไม่?

ฉันเห็นความแตกต่างของ CPU ซึ่งอาจเป็นเวลารวบรวม มีการตั้งค่า LINQ ใด ๆ ที่ส่งผลกระทบต่อสิ่งนี้หรือไม่

แก้ไข:

  • จับภาพแผนใน Profiler
  • คุณแน่ใจว่า SQL เหมือนกันใน Profilerหรือไม่?

ใช่มันสอดคล้องกันเป็นครั้งคราว ฉันไม่รู้การตั้งค่า linq แต่ฉันพบลิงค์นี้codeproject.com/KB/cs/linqsql2.aspx
Nico

คุณสามารถดูแผนในภาพด้านบนสำหรับทั้งแบบสอบถาม ใช่ฉันแน่ใจว่า SQL เหมือนกันใน profiler แอพพลิเคชั่น SQL, Profiler, SSMS และ C # ล้วนอยู่ในคอมพิวเตอร์ของฉันเพื่อการพัฒนา
Nico

จับภาพแผนจริงใน XML จาก Profiler ไม่ได้มาจากแคช คุณมีการตอบสนองที่แตกต่างกัน แต่คุณแสดงแผนแตกต่างกัน = แผนผิดที่ปรากฏข้างต้นอาจจะ
GBN


3

คุณจะต้องดูแผนปฏิบัติการสำหรับทั้งสองแบบสอบถามและดูว่าพวกเขาแตกต่างกันที่ไหน


ฉันเพิ่งแก้ไขโพสต์ของฉัน ... และฉันได้ตรวจสอบแล้วว่าแบบสอบถามทั้งสองใช้แผนเดียวกัน
Nico

1
ฉันเพิ่งเพิ่มกิจกรรมที่คุณบอกให้ฉันเป็นผู้สร้างโปรไฟล์และมันก็เหมือนกับคำขอสุดท้ายที่ฉันโพสต์ในคำถาม ฉันมีแผนเดียวกัน .. ความคิดอื่น ๆ ...
Nico

2
ทุกอย่างดูถูกต้อง สิ่งเดียวที่อาจอธิบายได้ก็คือหากแอ็พพลิเคชัน. NET ไม่ได้รับข้อมูลอย่างรวดเร็วเพียงพอ เวลาที่รายงานใน SQL Profiler รวมระยะเวลาในการถ่ายโอนข้อมูลจากเซิร์ฟเวอร์ไปยังไคลเอนต์ ดังนั้นหากลูกค้าไม่ดาวน์โหลดทุกอย่างเร็วพอเวลาเรียกใช้รายงานจะนานขึ้น
mrdenny

2
จากนั้นจะลงมาที่แอปพลิเคชันที่ทำกับข้อมูลและวิธีการอ่านข้อมูลจากฐานข้อมูล
mrdenny

3
เพื่อสนับสนุนคำตอบของ mrdenny ฉันเพิ่มว่าฉันทดสอบแบบสอบถามในไคลเอนต์ SQL ที่แตกต่างกัน 3 ตัวและเวลาที่รายงานของพวกเขานั้นแตกต่างกันทั้งหมดแม้ว่าสถิติ IO และการดำเนินการตามแผนจะเหมือนกัน มันเกิดจากวิธีการภายในของวิธีที่ลูกค้าปฏิบัติต่อข้อมูล ฉันเชื่อว่าคุณสามารถรับผลลัพธ์เวลาที่แตกต่างกันโดยการส่งออกไปยังไฟล์ไปยังตารางใน Management Studio หรือไปยังการส่งออกข้อความ อย่างไรก็ตามจากสิ่งที่ฉันจำได้ว่าเอกสารนั้นบอกว่า SQL จะเร็วกว่า LINQ ไปเป็น SQL เสมอดังนั้นนี่จึงไม่ใช่เรื่องแปลก :-)
Marian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.