0Pricing
SQL Academy · บทเรียน

การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน

ทำความรู้จักกลยุทธ์การรวมหลักทั้งสามแบบ โปรไฟล์ต้นทุนของแต่ละแบบ และช่วงเวลาที่ตัววางแผนเลือกใช้แต่ละแบบ

การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การอ่าน EXPLAIN และ EXPLAIN ANALYZE
  2. การสแกนตามลำดับเทียบกับการสแกนด้วยดัชนี
  3. การรวมแบบแฮชเทียบกับการรวมแบบผสานเทียบกับลูปซ้อน
  4. การระบุและแก้ไขคำสั่งค้นหาที่ทำงานช้า
← กลับไปที่ SQL Academy