ไม่มีมีไม่มีเอกสารจาก Microsoft รับประกันพฤติกรรมจึงจะไม่รับประกัน
นอกจากนี้สมมติว่าบทความคุยง่ายถูกต้องและที่ผู้ประกอบการทางกายภาพ Concatenation เสมอกระบวนการปัจจัยการผลิตในการสั่งซื้อที่ปรากฏในแผน (มีโอกาสมากที่จะเป็นจริง) แล้วโดยไม่มีการรับประกันว่า SQL Server จะเสมอสร้างแผนการที่เก็บเดียวกัน ลำดับระหว่างข้อความค้นหาและแผนแบบสอบถามคุณจะดีขึ้นเล็กน้อยเท่านั้น
เราสามารถตรวจสอบเรื่องนี้ต่อไปได้ หากเคียวรีเครื่องมือเพิ่มประสิทธิภาพสามารถจัดลำดับอินพุตตัวต่อ Concatenation ใหม่ได้ควรมีแถวใน DMV ที่ไม่มีเอกสารซึ่งsys.dm_exec_query_transformation_stats
สอดคล้องกับการปรับให้เหมาะสมนั้น
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
บน SQL Server 2012 Enterprise Edition สิ่งนี้จะสร้าง 24 แถว ไม่สนใจการจับคู่เท็จสำหรับการแปลงที่เกี่ยวข้องกับค่าคงที่มีการแปลงค่าหนึ่งที่เกี่ยวข้องกับการรวมตัวดำเนินการทางกายภาพUNIAtoCON
(การรวมทั้งหมดเป็นการรวมเข้าด้วยกัน) ดังนั้นในระดับตัวดำเนินการทางกายภาพปรากฏว่าเมื่อเลือกตัวดำเนินการเชื่อมต่อแล้วจะถูกประมวลผลตามลำดับของตัวดำเนินการสหภาพทั้งหมดที่ได้รับมา
ในความเป็นจริงนั้นไม่เป็นความจริงเลยทีเดียว มีการเขียนโพสต์ - ออพติไมซ์ใหม่ที่สามารถจัดลำดับอินพุตให้กับผู้ประกอบการเชื่อมต่อแบบฟิสิคัลหลังจากการปรับแต่งตามต้นทุนเสร็จสมบูรณ์ ตัวอย่างหนึ่งเกิดขึ้นเมื่อการต่อข้อมูลนั้นขึ้นอยู่กับเป้าหมายของแถว (ดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องอ่านจากอินพุตที่ถูกกว่าก่อน) ดูการUNION ALL
เพิ่มประสิทธิภาพโดย Paul White สำหรับรายละเอียดเพิ่มเติม
การเขียนทางกายภาพที่ล่าช้านั้นทำงานได้ถึงและรวมถึง SQL Server 2008 R2 แต่การถดถอยหมายความว่ามันจะไม่ถูกนำไปใช้กับ SQL Server 2012 และในภายหลัง แก้ไขได้รับการรับรองว่า reinstates เขียนนี้สำหรับ SQL Server 2014 และต่อมา (ไม่ใช่ 2012) ที่มีการสอบถามโปรแกรมแก้ไขด่วนเพิ่มประสิทธิภาพการเปิดใช้งาน (เช่นสถานะการติดตาม 4199)
แต่เกี่ยวกับ Logical Union All operator ( UNIA
)? มีการUNIAReorderInputs
แปลงซึ่งสามารถเรียงลำดับอินพุตได้ นอกจากนี้ยังมีตัวดำเนินการทางกายภาพสองตัวที่สามารถใช้เพื่อดำเนินการกับ Union All แบบลอจิคัลUNIAtoCON
และUNIAtoMERGE
(Union All เพื่อผสาน Union)
ดังนั้นจึงปรากฏว่าเคียวรีเครื่องมือเพิ่มประสิทธิภาพสามารถเรียงลำดับอินพุตสำหรับUNION ALL
; อย่างไรก็ตามดูเหมือนจะไม่เป็นการเปลี่ยนแปลงทั่วไป (ไม่มีการใช้งานUNIAReorderInputs
บนเซิร์ฟเวอร์ SQL ที่ฉันเข้าถึงได้โดยง่ายเราไม่ทราบว่าสถานการณ์ใดที่จะทำให้เครื่องมือเพิ่มประสิทธิภาพใช้UNIAReorderInputs
แม้ว่าจะมีการใช้อย่างแน่นอนเมื่อมีการนำทางหรือใช้แผน คำใบ้แผนใช้เพื่อบังคับแผนที่สร้างขึ้นโดยใช้ข้อมูลการเรียงลำดับตามจริงของเป้าหมายแถว
มีวิธีที่จะทำให้กระบวนการของเครื่องยนต์มากกว่าหนึ่งอินพุตในแต่ละครั้งหรือไม่?
ตัวดำเนินการทางกายภาพการต่อข้อมูลอาจมีอยู่ในส่วนที่ขนานกันของแผน ด้วยความยากลำบากบางอย่างฉันสามารถสร้างแผนการที่มีการต่อกันแบบขนานโดยใช้แบบสอบถามต่อไปนี้:
SELECT userid, regdate FROM ( --Users table is around 3mil rows
SELECT userid, RegDate FROM users WHERE userid > 1000000
UNION
SELECT userid, RegDate FROM users WHERE userid < 1000000
UNION all
SELECT userid, RegDate FROM users WHERE userid < 2000000
) d ORDER BY RegDate OPTION (RECOMPILE)
ดังนั้นในความหมายที่เข้มงวดที่สุดตัวดำเนินการเรียงต่อกันทางกายภาพดูเหมือนจะดำเนินการอินพุตในรูปแบบที่สอดคล้องกันเสมอ อย่างไรก็ตามเครื่องมือเพิ่มประสิทธิภาพสามารถสลับลำดับของอินพุตก่อนที่จะเลือกตัวดำเนินการทางกายภาพหรือใช้สหภาพผสานแทนการต่อกัน