มีวิธีใดบ้างที่จะทำให้เกิดผลลัพธ์ที่มี 3 guids ที่แตกต่างกันและไม่มีอีกต่อไป? ฉันหวังว่าจะสามารถตอบคำถามได้ดีขึ้นในอนาคตโดยรวมถึงคำแนะนำแผนกับแบบสอบถามชนิด CTE ที่มีการอ้างอิงหลายครั้งเพื่อเอาชนะปัญหา SQL Server CTE บางข้อ
ไม่ใช่วันนี้. นิพจน์ทั่วไปที่ไม่ใช่แบบเรียกซ้ำ (CTE) จะถูกใช้เป็นคำจำกัดความของมุมมองในบรรทัดและขยายเข้าไปในแผนผังคิวรีแบบโลจิคัลในแต่ละที่ที่ถูกอ้างอิง (เช่นเดียวกับนิยามมุมมองปกติ) ก่อนการปรับ ต้นไม้ตรรกะสำหรับแบบสอบถามของคุณคือ:
LogOp_OrderByCOL: Union1007 ASC COL: Union1015 ASC
LogOp_Project COL: Union1006 COL: Union1007 COL: Union1014 COL: Union1015
LogOp_Join
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_ViewAnchor
LogOp_UnionAll
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
LogOp_Project ScaOp_Intrinsic newid, ScaOp_Const
สังเกตุ View View Anchors สองตัวและการเรียกหกครั้งไปยังฟังก์ชันที่แท้จริงnewid
ก่อนที่จะเริ่มการปรับให้เหมาะสม อย่างไรก็ตามหลายคนคิดว่าเครื่องมือเพิ่มประสิทธิภาพควรจะสามารถระบุได้ว่าต้นไม้ย่อยที่ขยายออกมานั้นเป็นวัตถุอ้างอิงเดียวและทำให้มันง่ายขึ้น นอกจากนี้ยังมีการร้องขอการเชื่อมต่อหลายครั้งเพื่ออนุญาตการทำให้เป็นรูปธรรมชัดเจนของ CTE หรือตารางที่ได้รับ
การใช้งานทั่วไปที่มากขึ้นจะทำให้เครื่องมือเพิ่มประสิทธิภาพพิจารณา materializing นิพจน์ทั่วไปโดยพลการเพื่อปรับปรุงประสิทธิภาพ ( CASE
ด้วยแบบสอบถามย่อยเป็นอีกตัวอย่างหนึ่งที่ปัญหาสามารถเกิดขึ้นได้ในวันนี้) Microsoft Research เผยแพร่บทความ (PDF) ในช่วงเวลาดังกล่าวในปี 2550 แม้ว่าจะยังไม่มีการนำมาใช้งานจนถึงปัจจุบัน ในขณะนี้เราถูก จำกัด ให้เป็นรูปธรรมชัดเจนโดยใช้สิ่งต่างๆเช่นตัวแปรตารางและตารางชั่วคราว
SQLKiwi ได้กล่าวถึงการร่างแผนใน SSIS มีวิธีหรือเครื่องมือที่มีประโยชน์เพื่อช่วยในการจัดทำแผนดีสำหรับ SQL Server หรือไม่?
นี่เป็นเพียงความคิดที่ต้องการในส่วนของฉันและไปได้ดีกว่าความคิดในการปรับเปลี่ยนแนวทางการวางแผน ในความเป็นจริงแล้วเป็นไปได้ที่จะเขียนเครื่องมือเพื่อจัดการกับ XML โชว์แผนโดยตรง แต่หากไม่มีเครื่องมือเพิ่มประสิทธิภาพเฉพาะโดยใช้เครื่องมือน่าจะเป็นประสบการณ์ที่น่าหงุดหงิดสำหรับผู้ใช้ (และนักพัฒนานึกถึง)
ในบริบทเฉพาะของคำถามนี้เครื่องมือดังกล่าวจะยังไม่สามารถทำให้เนื้อหา CTE เป็นจริงในแบบที่ผู้บริโภคหลายคนสามารถใช้ (เพื่อป้อนข้อมูลทั้งสองไปยัง cross cross ในกรณีนี้) เครื่องมือเพิ่มประสิทธิภาพและเครื่องมือดำเนินการรองรับผู้ใช้หลายคน แต่เพื่อจุดประสงค์เฉพาะ - ไม่มีสิ่งใดที่สามารถนำไปใช้กับตัวอย่างเฉพาะนี้ได้
ในขณะที่ฉันไม่แน่ใจฉันมีลางสังหรณ์ที่ค่อนข้างแรงที่สามารถติดตาม RelOps ได้ (Nested Loop, Lazy Spool) แม้ว่าแบบสอบถามจะไม่เหมือนกับแผน - ตัวอย่างเช่นถ้าคุณเพิ่ม 4 และ 5 ลงใน CTE มันยังคงใช้แผนเดิมต่อไป (ทดสอบ - ดูเหมือนบน SQL Server 2012 RTM Express)
ที่นี่มีความยืดหยุ่นพอสมควร รูปร่างที่กว้างของแผน XML ถูกใช้เพื่อเป็นแนวทางในการค้นหาแผนขั้นสุดท้าย (แม้ว่าจะมีหลายแอ็ตทริบิวต์ที่ถูกละเว้นอย่างสิ้นเชิงเช่นประเภทการแบ่งพาร์ติชันในการแลกเปลี่ยน) และกฎการค้นหาปกติก็ค่อนข้างผ่อนคลายเช่นกัน ตัวอย่างเช่นการตัดแต่งต้นของทางเลือกโดยพิจารณาจากต้นทุนถูกปิดใช้งานการแนะนำ cross joins อย่างชัดเจนจะได้รับอนุญาตและการดำเนินการสเกลาร์จะถูกละเว้น
มีรายละเอียดมากเกินกว่าจะเจาะลึกได้ แต่การวางตำแหน่งของตัวกรองและคอมพิวเตอร์คำนวณ Scalars ไม่สามารถบังคับได้และภาคแสดงของแบบฟอร์มcolumn = value
จะเป็นแบบทั่วไปดังนั้นแผนการที่มีX = 1
หรือX = @X
สามารถนำไปใช้กับแบบสอบถามที่มีX = 502
หรือX = @Y
หรือความยืดหยุ่นนี้สามารถช่วยในการค้นหาแผนธรรมชาติที่จะบังคับ
ในตัวอย่างที่เฉพาะเจาะจงค่าคงที่ยูเนี่ยนทั้งหมดสามารถนำมาใช้เป็นการสแกนแบบคงที่ได้ตลอดเวลา จำนวนอินพุตไปยัง Union All ไม่สำคัญ