ฉันกำลังเขียนข้อความค้นหา SQL ที่เขียนไม่ดีขึ้นมาใหม่และมีการใช้ข้อความค้นหาย่อยมากเกินไป ฉันกำลังมองหาแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับการใช้ข้อความค้นหาย่อย
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม
ฉันกำลังเขียนข้อความค้นหา SQL ที่เขียนไม่ดีขึ้นมาใหม่และมีการใช้ข้อความค้นหาย่อยมากเกินไป ฉันกำลังมองหาแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับการใช้ข้อความค้นหาย่อย
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม
แบบสอบถามย่อยมักจะใช้ได้ เว้นแต่จะเป็น แบบสอบถามย่อยที่ขึ้นอยู่กับ (หรือที่เรียกว่า แบบสอบถามย่อยที่สัมพันธ์กัน) หากคุณใช้เฉพาะแบบสอบถามย่อยที่เป็นอิสระและพวกเขากำลังใช้ดัชนีที่เหมาะสม แบบสอบถามควรจะทำงานได้อย่างรวดเร็ว หากคุณมีแบบสอบถามย่อยที่ต้องพึ่งพา คุณอาจประสบปัญหาด้านประสิทธิภาพ เนื่องจากโดยทั่วไปแล้วแบบสอบถามย่อยที่ต้องพึ่งพาจะต้องถูกเรียกใช้หนึ่งครั้งสำหรับแต่ละแถวในแบบสอบถามภายนอก ดังนั้น หากแบบสอบถามภายนอกของคุณมี 1,000 แถว แบบสอบถามย่อยจะถูกเรียกใช้ 1,000 ครั้ง ในทางกลับกัน แบบสอบถามย่อยอิสระมักจะได้รับการประเมินเพียงครั้งเดียวเท่านั้น
หากคุณไม่แน่ใจว่าแบบสอบถามย่อยที่ขึ้นต่อกันหรือเป็นอิสระนั้นหมายถึงอะไร นี่เป็นกฎทั่วไป - หากคุณสามารถใช้แบบสอบถามย่อยได้ ให้ลบออกจากบริบท เรียกใช้ และรับชุดผลลัพธ์ มันจะเป็น independent subquery
หากคุณได้รับข้อผิดพลาดทางไวยากรณ์เนื่องจากตารางดังกล่าวอ้างอิงถึงบางตารางที่อยู่นอกแบบสอบถามย่อย แสดงว่าเป็น dependent subquery
แน่นอนว่ากฎทั่วไปมีข้อยกเว้นบางประการ ตัวอย่างเช่น:
หากประสิทธิภาพเป็นปัญหา ให้วัดคำค้นหาเฉพาะของคุณและดูว่าอะไรดีที่สุดสำหรับคุณ
ไม่มีกระสุนเงินที่นี่ การใช้งานแต่ละครั้งจะต้องได้รับการประเมินอย่างอิสระ มีบางกรณีที่แบบสอบถามย่อยที่สัมพันธ์กันไม่มีประสิทธิภาพเลย แบบสอบถามด้านล่างนี้ควรเขียนเป็น JOIN ดีกว่า
select nickname, (select top 1 votedate from votes where user_id=u.id order by 1 desc)
from users u
ในทางกลับกัน ข้อความค้นหาที่มีอยู่และไม่มีอยู่จะชนะมากกว่า JOIN
select ...
where NOT EXISTS (.....)
ปกติจะเร็วกว่า.
select ...
FROM A LEFT JOIN B
where B.ID is null
แม้ว่าลักษณะทั่วไปเหล่านี้อาจไม่เป็นจริงสำหรับสคีมาและการกระจายข้อมูลใดๆ
น่าเสียดายที่คำตอบนั้นขึ้นอยู่กับเซิร์ฟเวอร์ sql ที่คุณใช้เป็นอย่างมาก ตามทฤษฎีแล้ว การรวมจะดีกว่าจากมุมมองของทฤษฎีเชิงสัมพันธ์ที่บริสุทธิ์ พวกเขาปล่อยให้เซิร์ฟเวอร์ทำสิ่งที่ถูกต้องภายใต้ประทุนและให้การควบคุมมากขึ้น และในที่สุดก็จะเร็วขึ้นได้ หาก เซิร์ฟเวอร์ได้รับการติดตั้งอย่างดี ในทางปฏิบัติ เซิร์ฟเวอร์ SQL บางตัวทำงานได้ดีกว่าหากคุณหลอกให้เพิ่มประสิทธิภาพการสืบค้นผ่านแบบสอบถามย่อยและสิ่งที่คล้ายกัน