Lập trình 22/09/2026 6 phút

Ba thuật toán JOIN của PostgreSQL: nested loop, hash, merge — và vì sao planner chọn cái nào

JOIN không phải một phép — PostgreSQL có ba thuật toán để nối bảng, mỗi cái hợp một tình huống, và planner ước lượng để chọn. Bài này đo thật trên customers 1000 dòng ⋈ orders 2 triệu dòng: lọc một khách hàng thì Nested Loop chỉ 2.962ms; nối toàn bộ thì Hash Join (planner chọn) 133ms nhanh nhất, ép Nested Loop 187ms, ép Merge Join 301ms vì phải sắp xếp cả hai bên. Hiểu ba thuật toán để đọc plan và biết khi nào planner chọn sai.

Lập trình 22/09/2026 8 phút

Hash join đo thật: DuckDB ghép 10 triệu đơn với 100 nghìn khách theo khoá bằng chỉ mất 33 ms vì dựng bảng băm trên bên nhỏ rồi dò bằng bên lớn theo O(N cộng M), còn join theo khoảng rơi về nested loop O(N nhân M), chậm hơn 1142 lần

DuckDB ghép hai bảng lớn nhanh nhờ hash join: dựng bảng băm trên bên nhỏ rồi dò bằng bên lớn, độ phức tạp O(N cộng M) thay vì O(N nhân M) của nested loop. Đo thật: join 10 triệu đơn với 100 nghìn khách theo khoá bằng mất 33 ms, và thời gian tăng gần tuyến tính theo kích thước bảng fact (1 triệu 7,7 ms, 5 triệu 20,2 ms). Hash join chỉ dùng được cho điều kiện bằng; join theo khoảng nhỏ hơn rơi về nested loop và trên 20 nghìn nhân 20 nghìn mất 776 ms, chậm hơn equi-join 1142 lần vì bùng nổ tổ hợp.