ดูแลการแสดง:
ฉันพบว่าอย่างน้อยที่สุดกับEF Coreคำตอบที่ต่างออกไปอาจทำให้ประสิทธิภาพแตกต่างกัน ฉันรู้ว่า OP ถามเกี่ยวกับ Linq ถึง SQL แต่สำหรับฉันแล้วคำถามเดียวกันก็เกิดขึ้นกับ EF Core เช่นกัน
ในกรณีเฉพาะที่ฉันต้องจัดการข้อเสนอแนะ (syntactically nicer) โดย Marc Gravell ทำให้เกิดการรวมซ้ายใน cross ใช้ - คล้ายกับสิ่งที่ Mike U อธิบาย - ซึ่งมีผลที่ค่าใช้จ่ายโดยประมาณสำหรับการค้นหานี้เฉพาะสอง ครั้งตามที่สูงเมื่อเทียบกับแบบสอบถามที่ไม่มีการข้ามร่วม เวลาการดำเนินการของเซิร์ฟเวอร์ที่แตกต่างกันโดยปัจจัยที่ 3 [1]
การแก้ปัญหาโดย Marc Gravell ทำให้เกิดการสืบค้นโดยไม่มีการรวมข้าม
บริบท:ฉันจำเป็นต้องทำการรวมซ้ายสองตัวบนสองตารางโดยแต่ละรายการจำเป็นต้องเข้าร่วมอีกตารางหนึ่งอีกครั้ง นอกจากนี้ฉันต้องระบุเงื่อนไขอื่น ๆ ในตารางที่ฉันต้องการใช้การเข้าร่วมด้านซ้าย นอกจากนี้ฉันมีการเชื่อมต่อภายในสองครั้งบนโต๊ะหลัก
ค่าใช้จ่ายของผู้ให้บริการโดยประมาณ:
- ด้วยครอสใช้: 0.2534
- 0.0991 โดยไม่ต้องข้าม
เวลาดำเนินการของเซิร์ฟเวอร์หน่วยเป็นมิลลิวินาที (แบบสอบถามดำเนินการ 10 ครั้งวัดโดยใช้เวลาตั้งค่าสถิติเปิด):
- ใช้กากบาท: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
- โดยไม่ต้องข้ามใช้: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(การเรียกใช้ครั้งแรกช้ากว่าสำหรับข้อความค้นหาทั้งสองดูเหมือนว่ามีบางสิ่งในแคช)
ขนาดโต๊ะ:
- ตารางหลัก: 87 แถว
- ตารางแรกสำหรับการเข้าร่วมทางซ้าย: 179 แถว;
- ตารางที่สองสำหรับการเข้าร่วมทางซ้าย: 7 แถว
รุ่น EF Core: 2.2.1
รุ่นของ SQL Server: MS SQL Server 2017 - 14 ... (บน Windows 10)
ตารางที่เกี่ยวข้องทั้งหมดมีดัชนีในคีย์หลักเท่านั้น
ข้อสรุปของฉัน: ขอแนะนำเสมอให้ดู SQL ที่สร้างขึ้นเนื่องจากอาจแตกต่างกันจริงๆ
[1] น่าสนใจพอเมื่อตั้งค่า 'สถิติลูกค้า' ใน MS SQL Server Management Studio บนฉันจะเห็นแนวโน้มตรงกันข้าม กล่าวคือการดำเนินการครั้งสุดท้ายของการแก้ปัญหาโดยไม่ต้องใช้ cross นั้นใช้เวลามากกว่า 1 วินาที ฉันคิดว่ามีบางอย่างผิดปกติที่นี่ - อาจเป็นเพราะการตั้งค่าของฉัน