การต่อข้อมูลทางกายภาพ: รับประกันการดำเนินการตามคำสั่งหรือไม่?


12

ใน SQL มาตรฐานผลลัพธ์ของ a union allไม่ได้รับประกันว่าจะอยู่ในลำดับใด ๆ ดังนั้นสิ่งที่ชอบ:

select 'A' as c union all select 'B'

สามารถส่งคืนสองแถวในลำดับใดก็ได้ (แม้ว่าในทางปฏิบัติในฐานข้อมูลใด ๆ ที่ฉันรู้ว่า 'A' จะมาก่อน 'B')

ใน SQL Server สิ่งนี้จะเปลี่ยนเป็นแผนการดำเนินการโดยใช้การดำเนินการทางกายภาพ "การต่อข้อมูล"

ฉันนึกภาพออกได้ง่ายว่าการดำเนินการเรียงต่อกันจะสแกนอินพุตของมันคืนสิ่งที่อินพุตมีบันทึกไว้ อย่างไรก็ตามฉันพบข้อความต่อไปนี้บนเว็บ ( ที่นี่ ):

ตัวประมวลผลข้อความค้นหาจะดำเนินการตามแผนนี้ตามลำดับที่ผู้ให้บริการปรากฏในแผนข้อแรกคืออันดับแรกและรายการสุดท้ายคือรายการสุดท้าย

คำถาม: จริงหรือไม่ในทางปฏิบัติ สิ่งนี้รับประกันได้ว่าเป็นจริงหรือไม่?

ฉันไม่พบการอ้างอิงใด ๆ ในเอกสารประกอบของ Microsoft ที่อินพุตถูกสแกนตามลำดับตั้งแต่ครั้งแรกถึงครั้งสุดท้าย ในทางกลับกันเมื่อใดก็ตามที่ฉันพยายามเรียกใช้ผลลัพธ์แนะนำว่าอินพุตนั้นถูกประมวลผลตามลำดับ

มีวิธีที่จะทำให้กระบวนการของเครื่องยนต์มากกว่าหนึ่งอินพุตในแต่ละครั้งหรือไม่? การทดสอบของฉัน (โดยใช้นิพจน์ที่ซับซ้อนกว่าค่าคงที่) อยู่ในเครื่อง 8-core ที่เปิดใช้งานแบบขนานและการสืบค้นส่วนใหญ่จะใช้ประโยชน์จากความขนาน

คำตอบ:


10

ไม่มีมีไม่มีเอกสารจาก 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)

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


8

ตามคำสั่งของCraig Freedmanรับประกันการดำเนินการสำหรับผู้ดำเนินการเชื่อมต่อ

จากโพสต์บล็อกของเขาการดูแผนแบบสอบถามบนบล็อก MSDN:

โปรดทราบว่าเมื่อผู้ประกอบการมีลูกมากกว่าหนึ่งคนลำดับของเด็ก ๆ ก็มีความสำคัญ เด็กที่อยู่บนสุดคือเด็กคนแรกในขณะที่เด็กรองสุดคือคนที่สอง ตัวดำเนินการเรียงต่อกันประมวลผลชายด์ตามลำดับนี้

และจากหนังสือออนไลน์Showplan การอ้างอิงผู้ประกอบการเชิงตรรกะและกายภาพ

ตัวดำเนินการทางกายภาพการต่อข้อมูลมีสองอินพุตหรือมากกว่าและหนึ่งเอาต์พุต การต่อข้อมูลคัดลอกแถวจากอินพุตแรกไปยังสตรีมเอาต์พุตจากนั้นทำซ้ำการดำเนินการนี้สำหรับแต่ละสตรีมอินพุตเพิ่มเติม


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

2

ชุมชนวิกิพีเดียคำตอบ :

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

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

การขาดเอกสารที่เป็นทางการและชัดเจนแนะนำให้ฉันว่าคุณไม่ควรพึ่งพาสิ่งนี้ ตรงนี้เป็นชนิดของสิ่งที่มีคนมีปัญหากับORDER BYในมุมมองและGROUP BYโดยไม่ต้องORDER BY, 8 ปีที่ผ่านมาเมื่อเพิ่มประสิทธิภาพ SQL Server 2005 ได้รับการปล่อยตัว

ด้วยคุณสมบัติใหม่ทั้งหมดใน SQL Server เวอร์ชั่นใหม่ (ที่กำลังจะมีมากขึ้น) แม้ว่าคุณจะคิดว่าคุณสามารถรับประกันพฤติกรรมที่เฉพาะเจาะจงในวันนี้ได้ฉันก็ไม่คาดหวังให้มันเป็นจริง (จนกว่าจะมีการบันทึกไว้)

แม้ว่าคุณจะไม่ได้ขึ้นอยู่กับพฤติกรรมนี้คุณจะทำอะไรกับผลลัพธ์ อย่างไรก็ตามผมจะไม่เรียกบทความคุยง่ายโดยคนนอกอย่างเป็นทางการ สำหรับทั้งหมดที่เรารู้ว่านี่เป็นเพียงการเดาตามการสังเกต

Microsoft จะไม่เผยแพร่เอกสารอย่างเป็นทางการว่า 'x' ไม่รับประกันว่าจะทำ 'y' นี่คือหนึ่งในเหตุผลที่เรายังคงเกือบทศวรรษต่อมามีปัญหาในการโน้มน้าวใจคนที่พวกเขาไม่สามารถพึ่งพาการสั่งซื้อที่สังเกตได้โดยORDER BYไม่มีเอกสารที่ระบุว่า "ไม่รับประกัน"

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