Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2312 bài viết · Website
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.

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

Continuous profiling trong Go: hồ sơ CPU/bộ nhớ từ dịch vụ đang chạy thật

Benchmark cục bộ chỉ đo cái bạn nghĩ là nóng; điểm nóng production thường ở chỗ bất ngờ với tải và dữ liệu thật. net/http/pprof phơi endpoint để thu hồ sơ từ dịch vụ đang chạy mà không dừng nó. Đo thật trong Go: thu CPU profile 3 giây từ service live, pprof chỉ đúng hàm nóng 100% CPU.

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

Đọc panic trace và runtime.Stack trong Go: mổ xẻ từng dòng để chẩn đoán crash

Panic trace không phải chữ đỏ đáng sợ mà là bản đồ đầy đủ để tìm bug. Bài này mổ xẻ từng phần: số hiệu goroutine, trạng thái [running]/[chan receive]/[sync.Mutex.Lock], ngăn xếp đọc từ đâu, tham số hex, tín hiệu SIGSEGV — và dùng runtime.Stack chụp mọi goroutine. Đo thật trong Go 1.23.