การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน
ทำความรู้จักกลยุทธ์การรวมหลักทั้งสามแบบ โปรไฟล์ต้นทุนของแต่ละแบบ และช่วงเวลาที่ตัววางแผนเลือกใช้แต่ละแบบ
การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
สามกลยุทธ์การเชื่อมตาราง
PostgreSQL มีขั้นตอนวิธีการเชื่อมตารางทางกายภาพสามแบบ:
- ลูปซ้อน — สำหรับแต่ละแถวด้านนอก ให้สแกนด้านใน
- การเชื่อมตารางแบบแฮช — สร้างตารางแฮชจากด้านใน แล้วค้นหาด้วยด้านนอก
- การเชื่อมตารางแบบผสาน — เรียงลำดับทั้งสองด้าน แล้วผสานไปพร้อมกัน
ลูปซ้อน
วิธีที่ง่ายที่สุด: ด้านนอก × ด้านใน ทำงานได้รวดเร็วเมื่อด้านในมีดัชนีที่ดี AND ด้านนอกมีขนาดเล็ก:
EXPLAIN ANALYZE
SELECT * FROM users u JOIN orders o ON o.user_id = u.id
WHERE u.id = 42;
-- Nested Loop
-- -> Index Scan on users where id = 42 (rows=1)
-- -> Index Scan on orders_user_id_idx (rows=5)เมื่อลูปซ้อนได้เปรียบ
หากด้านนอกมีไม่กี่แถว AND ด้านในมีดัชนีบนคีย์ที่ใช้เชื่อมตาราง ลูปซ้อนจะทำงานได้รวดเร็วมาก กรณีแย่ที่สุดคือ O(ด้านนอก × ด้านใน)
การเชื่อมตารางแบบแฮช
สร้างตารางแฮชจากด้านหนึ่ง (โดยปกติคือด้านที่เล็กกว่า) แล้วค้นหาด้วยอีกด้านหนึ่ง เหมาะอย่างยิ่งสำหรับการเชื่อมตารางขนาดใหญ่สองตารางเมื่อไม่มีดัชนีที่มีประโยชน์บนคีย์ที่ใช้เชื่อมตาราง:
EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key;
-- Hash Join (cost=10000..50000)
-- -> Seq Scan on big_a
-- -> Hash
-- -> Seq Scan on big_bเมื่อการเชื่อมตารางแบบแฮชได้เปรียบ
เหมาะกับตารางขนาดกลางถึงใหญ่สองตารางที่ไม่มีดัชนีที่ดีบนคีย์ที่ใช้เชื่อมตาราง หรือเมื่อตัววางแผนต้องใช้หลายแถว มีข้อจำกัดด้านหน่วยความจำ: ตารางแฮชต้องพอดีกับ work_mem มิฉะนั้นจะถูกเขียนลงดิสก์
การเชื่อมตารางแบบผสาน
เรียงลำดับทั้งสองด้านตามคีย์ที่ใช้เชื่อมตาราง แล้วไล่ดูไปพร้อมกัน เหมาะอย่างยิ่งเมื่อทั้งสองด้านเรียงลำดับอยู่แล้ว (เช่น เรียงตามดัชนีที่ตรงกัน):
EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key
ORDER BY a.key;
-- Merge Join
-- -> Index Scan on big_a (a.key ASC)
-- -> Index Scan on big_b (b.key ASC)เมื่อการเชื่อมตารางแบบผสานได้เปรียบ
เหมาะกับข้อมูลนำเข้าขนาดใหญ่สองชุดที่เรียงลำดับไว้แล้ว ใช้การสแกนเชิงเส้นและหน่วยความจำน้อย ต้นทุนการเรียงลำดับมีความสำคัญ หากทั้งสองด้านต้องเรียงลำดับใหม่อย่างชัดเจน การเชื่อมตารางแบบแฮชมักได้เปรียบกว่า
การเลือกกลยุทธ์
ตัววางแผนเลือกโดยพิจารณาจาก:
- จำนวนแถวที่ประมาณการ
- ดัชนีที่มีอยู่
- หน่วยความจำ (
work_mem) - ค่าคงที่ต้นทุนใน postgresql.conf
บังคับใช้กลยุทธ์ (เพื่อการวินิจฉัยเท่านั้น)
เพื่อการแก้ไขข้อบกพร่อง คุณสามารถปิดใช้กลยุทธ์บางอย่างได้:
SET enable_hashjoin = off;
SET enable_mergejoin = off;
SET enable_nestloop = off;
-- Re-run EXPLAIN to see what the planner picks instead.
-- NEVER persist these in production.การล้นไปยังดิสก์
หากตารางแฮชหรือการเรียงลำดับใช้พื้นที่เกิน work_mem ตัวดำเนินการจะเขียนไฟล์ชั่วคราวลงดิสก์ ซึ่งช้ากว่ามาก ให้เพิ่มค่า work_mem หรือเขียนคำสั่งค้นหาใหม่
การเชื่อมตารางแบบขนาน
PostgreSQL สามารถประมวลผลการเชื่อมตารางแบบแฮชและแบบผสานแบบขนานได้ รวมถึงการสแกนตามลำดับและการสแกนดัชนี โดยจะแสดงเป็น Parallel Hash Join พร้อม Workers Planned ใน EXPLAIN
การอ่านตัวเลือก
ใน EXPLAIN ANALYZE ชื่อโหนดการเชื่อมตารางจะบอกกลยุทธ์ที่ใช้ โดยเกือบทุกครั้งตัวเลือกนี้เหมาะสมแล้ว หากไม่เหมาะสม ให้ตรวจสอบสถิติและดัชนีก่อนบังคับใช้กลยุทธ์
สรุป
กลยุทธ์การเชื่อมตารางทั้งสามแบบเหมาะกับรูปแบบข้อมูลที่แตกต่างกัน
- ลูปซ้อน: ด้านนอกมีขนาดเล็ก + ด้านในมีดัชนี
- แฮช: ตารางขนาดใหญ่ที่ไม่มีดัชนีที่มีประโยชน์
- ผสาน: ข้อมูลนำเข้าที่เรียงลำดับไว้แล้ว
ตรวจสอบความเข้าใจอย่างรวดเร็ว
กำลังเชื่อมตารางขนาด 10 ล้านแถวสองตารางด้วยคอลัมน์ที่ไม่มีดัชนี ตัววางแผนมีแนวโน้มจะเลือกขั้นตอนวิธีการเชื่อมตารางแบบใด
คำถามที่พบบ่อย
บทเรียน “การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน”
ทำความรู้จักกลยุทธ์การรวมหลักทั้งสามแบบ โปรไฟล์ต้นทุนของแต่ละแบบ และช่วงเวลาที่ตัววางแผนเลือกใช้แต่ละแบบ คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอ่าน EXPLAIN และ EXPLAIN ANALYZE
- การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี
- การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน
- การระบุและแก้ไขคำสั่งค้นหาที่ทำงานช้า