แฮชรวม bailout


10

คำถามที่เกิดขึ้นในการสนทนาการแชท:

ฉันรู้ว่าแฮชเข้าร่วม bailout สวิตช์ภายในเพื่อเรียงลำดับของลูปซ้อนกัน

SQL Server ทำอะไรให้กับแฮชรวม bailout (ถ้ามันสามารถเกิดขึ้นได้ทั้งหมด)?

คำตอบ:


11

การรวมแฮชและการรวมแฮชจะใช้รหัสโอเปอเรเตอร์เดียวกันภายในแม้ว่าการรวมแฮชจะใช้อินพุต (บิลด์) เดียวเท่านั้น การดำเนินการขั้นพื้นฐานของกัญชารวมจะอธิบายโดยเครกเป็นอิสระ :

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

เขาพูดต่อเกี่ยวกับการเรียกซ้ำแฮช:

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

bailout

Hail bailoutมีการบันทึกไว้เล็กน้อย แต่ Nacho Alonso Portillo กล่าวถึงในระดับสูงสุดของการเรียกซ้ำ hash iterator ก่อนบังคับให้มีการประกันตัว?

ค่าเป็นค่าคงที่และเข้ารหัสยากในผลิตภัณฑ์และค่าของมันคือห้า (5) ซึ่งหมายความว่าก่อนที่ผู้ดำเนินการสแกนแฮชจะใช้อัลกอริธึมที่ใช้การเรียงลำดับสำหรับส่วนย่อยที่กำหนดซึ่งไม่พอดีกับหน่วยความจำที่อนุญาตจากเวิร์กสเปซห้าครั้งก่อนหน้านี้ในการแบ่งพาร์ติชันดั้งเดิม

"การดำเนินการสแกนกัญชา" ที่กล่าวถึงมีการอ้างอิงถึงระดับภายในในCQScanHash sqlmin.dllคลาสนี้เป็นผู้นำการใช้งานตัวดำเนินการแฮช (ในทุกรูปแบบรวมถึงการรวมบางส่วนและการไหลที่แตกต่าง) ที่เราเห็นในแผนการดำเนินการ

อัลกอริทึม Bailout

นี่นำเรามาสู่คำถามของคุณ - อัลกอริทึม bailout ทำอะไรกันแน่? มันเป็น "เรียงตาม" หรือตาม "เรียงลำดับของลูปซ้อนกัน"?

มันเป็นทั้งเนื้อหาขึ้นอยู่กับมุมมองของคุณ เมื่อการเรียกซ้ำแฮชถึงระดับ 5 พาร์ติชันแฮชในหน่วยความจำจะเปลี่ยนจากการเป็นตารางแฮชไปเป็นดัชนี b-tree ที่ว่างเปล่าเริ่มต้นบนค่าแฮช แต่ละแถวจากพาร์ติชันแฮชที่แบ่งไว้ก่อนหน้านี้เดียวจะค้นหาในดัชนี b-tree และแทรก (กลุ่มใหม่) หรืออัปเดต (คงไว้ซึ่งการรวม) ตามความเหมาะสม

ชุดของเม็ดมีดที่ไม่เรียงลำดับนี้ไปยังทรี b สามารถมองเห็นได้อย่างเท่าเทียมกันในรูปแบบการแทรกหรือการค้นหาลูปซ้อนที่จัดทำดัชนี

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

เมื่อหน่วยความจำที่มีอยู่เพื่อเก็บดัชนี b-tree หมดลงแถวใด ๆ เพิ่มเติม (จากพาร์ทิชันที่รั่วไหลในปัจจุบัน) จะถูกส่งไปยังพาร์ติชันtempdbใหม่เดียว(ซึ่งรับประกันว่ามีขนาดเล็กลง) และกระบวนการซ้ำตามความจำเป็น ระดับการรั่วไหลยังคงอยู่ที่ 5 เนื่องจากการเรียกแฮชสิ้นสุดลง รายละเอียดการประมวลผลบางอย่างสามารถสังเกตได้ด้วยค่าสถานะการติดตามที่ไม่มีเอกสาร 7357

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