สัญญาณทั่วไปของปัญหาการสืบค้น N+1 รวมถึงตัวบ่งชี้รายละเอียดต่อไปนี้:
- จำนวนการสืบค้นที่มากเกินไป: สัญญาณที่ชัดเจนที่สุดคือแอปพลิเคชันของคุณดำเนินการสืบค้นฐานข้อมูลมากกว่าที่คาดไว้ โดยทั่วไปแล้วคุณจะเห็นการสืบค้นเริ่มต้นหนึ่งรายการเพื่อดึงรายการบันทึกตามด้วยการสืบค้นเพิ่มเติมสำหรับแต่ละระเบียนเพื่อดึงข้อมูลที่เกี่ยวข้อง ตัวอย่างเช่นการดึงผู้ใช้ 10 คนจากนั้นเรียกใช้แบบสอบถามแยกกัน 10 แบบเพื่อให้โพสต์ของผู้ใช้แต่ละคนส่งผลให้มีการสืบค้น 11 ครั้งแทนที่จะเป็นแบบสอบถามที่ได้รับการปรับปรุงเพียงหนึ่งเดียว [1] [3]
- เวลาตอบสนองของแอปพลิเคชันช้า: เนื่องจากแบบสอบถามแต่ละครั้งต้องใช้การเดินทางไปกลับไปยังฐานข้อมูลผลกระทบสะสมของการสืบค้นขนาดเล็กจำนวนมากทำให้การดึงข้อมูลช้าลงอย่างมีนัยสำคัญ สิ่งนี้นำไปสู่การโหลดหน้าเว็บที่ช้าลงหรือตอบสนอง API ทำให้แอปพลิเคชันตอบสนองต่อคำขอของผู้ใช้น้อยลง [1] [5]
- การโหลดฐานข้อมูลสูง: เซิร์ฟเวอร์ฐานข้อมูลประสบการณ์เพิ่มขึ้นโหลดเนื่องจากการสืบค้นจำนวนมากซึ่งสามารถกรองทรัพยากรและลดปริมาณงานโดยรวมของระบบ สิ่งนี้สามารถลดประสิทธิภาพและ จำกัด ได้เมื่อจำนวนผู้ใช้หรือข้อมูลเพิ่มขึ้น [3] [5] [6]
- มองไม่เห็นในบันทึกการสืบค้นช้า: ซึ่งแตกต่างจากการสืบค้นช้าเพียงครั้งเดียวปัญหา N+1 มักจะไม่มีใครสังเกตเห็นในบันทึกการสืบค้นช้าเนื่องจากการสืบค้นแต่ละรายการทำงานได้อย่างรวดเร็ว อย่างไรก็ตามผลรวมของการสืบค้นจำนวนมากทำให้เกิดการลดลงของประสิทธิภาพ [2]
- การสืบค้นที่ไม่คาดคิดหรือซ่อนเร้นที่เกิดขึ้นโดย ORM: เมื่อใช้กรอบการทำแผนที่ความสัมพันธ์แบบวัตถุ (ORM) ปัญหา N+1 มักเกิดขึ้นเนื่องจากการโหลดขี้เกียจหรือการกำหนดค่าผิดพลาด การเข้าถึงเอนทิตีที่เกี่ยวข้องในลูปสามารถเรียกใช้การสืบค้นเพิ่มเติมโดยไม่ต้องโทรอย่างชัดเจนในรหัสทำให้ยากที่จะตรวจจับได้เพียงแค่ดูที่ซอร์สโค้ด [2] [5] [6]
- คอขวดประสิทธิภาพในรูปแบบการดึงข้อมูล: หากแอปพลิเคชันของคุณมีความสัมพันธ์กับวัตถุที่ซับซ้อนและดึงข้อมูลที่เกี่ยวข้องในหลายขั้นตอนแทนที่จะเป็นแบบสอบถามที่ได้รับการปรับปรุงเดียวรูปแบบนี้เป็นตัวบ่งชี้ที่แข็งแกร่งของปัญหา N+1 [6]
โดยสรุปสัญญาณทั่วไปคือการสืบค้นฐานข้อมูลจำนวนมากโดยไม่คาดคิดสำหรับสิ่งที่ควรจะเป็นการดึงข้อมูลอย่างง่ายเวลาตอบสนองช้าเนื่องจากการเดินทางรอบฐานข้อมูลหลายครั้งเพิ่มการโหลดบนเซิร์ฟเวอร์ฐานข้อมูล อาการเหล่านี้เป็นที่แพร่หลายโดยเฉพาะอย่างยิ่งในแอปพลิเคชันโดยใช้ ORMS ที่มีพฤติกรรมการโหลดขี้เกียจเริ่มต้น [1] [2] [3] [5] [6] [7]
การอ้างอิง:
[1] https://planetscale.com/blog/what-is--n-1-query-problem-and-how-to-o-solve-it
[2] https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping
[3] https://www.pingcap.com/article/how-to-efficiently-solve-the-n1-query-problem/
[4] https://evnedev.com/blog/development/the-n1-query-problem-what-is-it-and-how-do-you-solve-it/
[5] https://digma.ai/n1-query-problem-and-how-to-detect-it/
[6] https://www.neurelo.com/post/what-is-the-n- -1-query-problem
[7] https://dev.to/lovestaco/the-n1-query-problem-the-silent-performance-killer-2b1c
[8] https://www.pullrequest.com/blog/avoiding-n-1-database-queries-in-asp-net-a-practical-guide/