คำถามที่เกิดขึ้นในการสนทนาการแชท:
ฉันรู้ว่าแฮชเข้าร่วม bailout สวิตช์ภายในเพื่อเรียงลำดับของลูปซ้อนกัน
SQL Server ทำอะไรให้กับแฮชรวม bailout (ถ้ามันสามารถเกิดขึ้นได้ทั้งหมด)?
คำถามที่เกิดขึ้นในการสนทนาการแชท:
ฉันรู้ว่าแฮชเข้าร่วม bailout สวิตช์ภายในเพื่อเรียงลำดับของลูปซ้อนกัน
SQL Server ทำอะไรให้กับแฮชรวม bailout (ถ้ามันสามารถเกิดขึ้นได้ทั้งหมด)?
คำตอบ:
การรวมแฮชและการรวมแฮชจะใช้รหัสโอเปอเรเตอร์เดียวกันภายในแม้ว่าการรวมแฮชจะใช้อินพุต (บิลด์) เดียวเท่านั้น การดำเนินการขั้นพื้นฐานของกัญชารวมจะอธิบายโดยเครกเป็นอิสระ :
เช่นเดียวกับการเข้าร่วมแฮชการรวมแฮชต้องใช้หน่วยความจำ ก่อนเรียกใช้งานแบบสอบถามด้วยการรวมแฮช SQL Server จะใช้การประเมินแบบเชิงปริมาณเพื่อประเมินจำนวนหน่วยความจำที่เราต้องใช้ในการดำเนินการแบบสอบถาม ด้วยการเข้าร่วมแฮชเราเก็บแต่ละแถวบิลด์ดังนั้นความต้องการหน่วยความจำทั้งหมดจึงเป็นสัดส่วนกับจำนวนและขนาดของแถวบิลด์ จำนวนแถวที่เข้าร่วมและความสำคัญของเอาต์พุตของการรวมไม่มีผลต่อความต้องการหน่วยความจำของการรวม ด้วยการรวมแฮชเราเก็บหนึ่งแถวสำหรับแต่ละกลุ่มดังนั้นความต้องการหน่วยความจำทั้งหมดจึงเป็นสัดส่วนกับจำนวนและขนาดของกลุ่มเอาท์พุทหรือแถว หากเรามีค่าที่ไม่ซ้ำกันของกลุ่มตามคอลัมน์และกลุ่มที่น้อยกว่าเราต้องการหน่วยความจำน้อยลง หากเรามีค่าที่ไม่ซ้ำกันมากขึ้นของกลุ่มตามคอลัมน์และกลุ่มอื่น ๆ เราต้องการหน่วยความจำมากขึ้น
เขาพูดต่อเกี่ยวกับการเรียกซ้ำแฮช:
ดังนั้นจะเกิดอะไรขึ้นถ้าเรามีหน่วยความจำไม่เพียงพอ อีกครั้งเช่นเดียวกับการเข้าร่วมแฮชถ้าเรามีหน่วยความจำไม่เพียงพอเราจะต้องเริ่มต้นการกระจายแถวไปที่ tempdb เราทำการรั่วไหลอย่างน้อยหนึ่งถังหรือพาร์ติชั่นรวมถึงผลลัพธ์ที่สรุปรวมบางส่วนพร้อมกับแถวใหม่เพิ่มเติมที่จะแฮ็คไปยังที่เก็บหรือพาร์ทิชันที่หก แม้ว่าเราจะไม่พยายามรวมแถวใหม่ที่มีการรั่วไหล แต่เราจะทำการแฮชแถวนั้นและแบ่งออกเป็นหลาย ๆ ถังหรือพาร์ติชั่น เมื่อเราเสร็จสิ้นการประมวลผลกลุ่มอินพุตทั้งหมดแล้วเราจะส่งออกกลุ่มในหน่วยความจำที่เสร็จสมบูรณ์แล้วและทำซ้ำอัลกอริทึมโดยการอ่านย้อนกลับและรวมพาร์ติชันที่รั่วไหลครั้งละหนึ่งพาร์ติชัน โดยการแบ่งแถวที่มีการรั่วไหลออกเป็นหลายพาร์ติชั่นเราจะลดขนาดของแต่ละพาร์ติชันและลดความเสี่ยงที่อัลกอริทึมจะต้องทำซ้ำหลายครั้ง
Hail bailoutมีการบันทึกไว้เล็กน้อย แต่ Nacho Alonso Portillo กล่าวถึงในระดับสูงสุดของการเรียกซ้ำ hash iterator ก่อนบังคับให้มีการประกันตัว?
ค่าเป็นค่าคงที่และเข้ารหัสยากในผลิตภัณฑ์และค่าของมันคือห้า (5) ซึ่งหมายความว่าก่อนที่ผู้ดำเนินการสแกนแฮชจะใช้อัลกอริธึมที่ใช้การเรียงลำดับสำหรับส่วนย่อยที่กำหนดซึ่งไม่พอดีกับหน่วยความจำที่อนุญาตจากเวิร์กสเปซห้าครั้งก่อนหน้านี้ในการแบ่งพาร์ติชันดั้งเดิม
"การดำเนินการสแกนกัญชา" ที่กล่าวถึงมีการอ้างอิงถึงระดับภายในในCQScanHash
sqlmin.dll
คลาสนี้เป็นผู้นำการใช้งานตัวดำเนินการแฮช (ในทุกรูปแบบรวมถึงการรวมบางส่วนและการไหลที่แตกต่าง) ที่เราเห็นในแผนการดำเนินการ
นี่นำเรามาสู่คำถามของคุณ - อัลกอริทึม bailout ทำอะไรกันแน่? มันเป็น "เรียงตาม" หรือตาม "เรียงลำดับของลูปซ้อนกัน"?
มันเป็นทั้งเนื้อหาขึ้นอยู่กับมุมมองของคุณ เมื่อการเรียกซ้ำแฮชถึงระดับ 5 พาร์ติชันแฮชในหน่วยความจำจะเปลี่ยนจากการเป็นตารางแฮชไปเป็นดัชนี b-tree ที่ว่างเปล่าเริ่มต้นบนค่าแฮช แต่ละแถวจากพาร์ติชันแฮชที่แบ่งไว้ก่อนหน้านี้เดียวจะค้นหาในดัชนี b-tree และแทรก (กลุ่มใหม่) หรืออัปเดต (คงไว้ซึ่งการรวม) ตามความเหมาะสม
ชุดของเม็ดมีดที่ไม่เรียงลำดับนี้ไปยังทรี b สามารถมองเห็นได้อย่างเท่าเทียมกันในรูปแบบการแทรกหรือการค้นหาลูปซ้อนที่จัดทำดัชนี
ในกรณีใด ๆ อัลกอริทึมทางเลือกนี้รับประกันว่าจะเสร็จสมบูรณ์ในที่สุดโดยไม่ต้องจัดสรรหน่วยความจำเพิ่มเติม อาจต้องผ่านหลายครั้งหากพื้นที่ว่างสำหรับ b-tree ไม่เพียงพอที่จะเก็บคีย์การจัดกลุ่มทั้งหมดและการรวมจากพาร์ติชันล้น
เมื่อหน่วยความจำที่มีอยู่เพื่อเก็บดัชนี b-tree หมดลงแถวใด ๆ เพิ่มเติม (จากพาร์ทิชันที่รั่วไหลในปัจจุบัน) จะถูกส่งไปยังพาร์ติชันtempdbใหม่เดียว(ซึ่งรับประกันว่ามีขนาดเล็กลง) และกระบวนการซ้ำตามความจำเป็น ระดับการรั่วไหลยังคงอยู่ที่ 5 เนื่องจากการเรียกแฮชสิ้นสุดลง รายละเอียดการประมวลผลบางอย่างสามารถสังเกตได้ด้วยค่าสถานะการติดตามที่ไม่มีเอกสาร 7357