กฎใดที่กำหนดเมื่อ SQL Server ใช้ CTE เป็น "รั้วการปรับให้เหมาะสม"


10

ในขณะที่กลับมา Brent Ozar เผยแพร่โพสต์รายละเอียดบางส่วนของความแตกต่างระหว่าง SQL Server และ PostgreSQL:

ความแตกต่างที่สำคัญสองประการระหว่าง SQL Server กับ PostgreSQL

จุดแรก (“ CTE เป็นรั้วการเพิ่มประสิทธิภาพ”) จับตาของฉันเพราะเห็นได้ชัดว่าในตัวอย่างที่มีให้ SQL Server รวม CTE และแบบสอบถามหลักเข้าด้วยกันและปรับให้เป็นแบบสอบถามเดียว (ตรงข้ามกับพฤติกรรมตรงข้ามใน PostgreSQL)

อย่างไรก็ตามพฤติกรรมนี้ดูเหมือนจะตรงกันข้ามกับตัวอย่างที่ฉันเห็นในบล็อกและคลาสฝึกอบรมอื่น ๆ ที่ SQL Server ใช้ CTE เป็นรั้วการปรับให้เหมาะสมซึ่งช่วยให้ใช้ดัชนีได้ดีขึ้นประสิทธิภาพที่ดีขึ้นเป็นต้นตัวอย่างเช่น

วิธีที่ดีกว่าในการเลือกดาว

ดังนั้นดูเหมือนว่า SQL Server จะ "ให้เกียรติ" CTE เป็นกรอบการเพิ่มประสิทธิภาพบางครั้ง มีทรัพยากรที่ดีใดบ้างที่บันทึกรายการเฉพาะของกรณีที่ทราบซึ่ง SQL Server จะให้เกียรติ CTE อย่างน่าเชื่อถือเป็นรั้วการเพิ่มประสิทธิภาพ (หรือพฤติกรรมที่ตรงกันข้าม)

คำตอบ:


10

... รายการกรณีที่ทราบที่ SQL Server จะให้เกียรติ CTE อย่างน่าเชื่อถือเป็นรั้วการเพิ่มประสิทธิภาพ

รายการดังกล่าวจะขึ้นอยู่กับพฤติกรรมที่สังเกตได้โดยไม่รับประกันความน่าเชื่อถือ

เครื่องมือเพิ่มประสิทธิภาพการสืบค้น SQL Server ไม่ถือว่านิพจน์ตารางทั่วไปเป็นรั้วการเพิ่มประสิทธิภาพต่อ seแม้ว่าการสร้างบางอย่างจะยากที่จะปรับให้เหมาะสม CTE แบบเรียกซ้ำเป็นตัวอย่างที่ดีของสิ่งนี้

CTE ได้รับการปฏิบัติเช่นเดียวกันกับมุมมอง / ฟังก์ชั่นอินไลน์ / แบบสอบถามย่อย / ตารางที่ได้รับและอินไลน์เข้าไปในแบบสอบถาม พฤติกรรม 'รั้ว' ใด ๆ ที่สังเกตได้นั้นขึ้นอยู่กับเครื่องมือเพิ่มประสิทธิภาพไม่สามารถหรือตัดสินใจที่จะไม่ปรับให้เหมาะสมในขอบเขตที่สามารถซึมผ่านได้ในหลักการ

โดยทั่วไปแล้ว CTE ที่ 'เรียบง่ายและมากขึ้น' ก็ยิ่งมีความเป็นไปได้มากขึ้นที่เครื่องมือเพิ่มประสิทธิภาพจะสามารถเคลื่อนย้ายบิตได้

คุณลักษณะที่จะช่วยให้เครื่องมือเพิ่มประสิทธิภาพในการพิจารณาหรือบังคับให้เป็นจริง 'ผล' ของ CTE ได้รับการแนะนำ แต่ยังไม่ได้ใช้งาน:

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

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