Cơ sở dữ liệu 29/08/2026 10 phút

Cùng bài top-3 mỗi nhân viên: SQL mất 78 ms, kéo về ứng dụng tự tính mất 1.070 ms và 25 MB qua mạng

Window function giải lớp bài toán GROUP BY không giải nổi: xếp hạng trong nhóm, so với dòng trước, cộng dồn. Tôi đo chi phí thật của chúng, so với LATERAL và với cách kéo dữ liệu về ứng dụng tự tính — và bất ngờ là LATERAL nhanh gần gấp đôi window function.

Cơ sở dữ liệu 29/08/2026 10 phút

Gấp 64 lần bộ nhớ cho GROUP BY chỉ nhanh hơn 3% — vì chi phí nằm ở số nhóm, không ở số dòng

GROUP BY dễ viết nhất mà khó đoán chi phí nhất. Tôi đo lượng bộ nhớ nó thật sự dùng và tìm ra: chi phí phụ thuộc số nhóm đầu ra chứ không phải số dòng đầu vào, cho thêm bộ nhớ gần như vô ích, và một chỉ mục cho 2× tốc độ với 0 bộ nhớ.

Cơ sở dữ liệu 29/08/2026 10 phút

Trang cuối đọc đủ 5 triệu dòng để trả về 20 — và OFFSET còn âm thầm bỏ sót dữ liệu khi có người xoá bài

LIMIT 20 OFFSET 1000 là cách phân trang ai cũng viết đầu tiên: đúng, ngắn, và chậm dần theo số trang — nhưng chậm bao nhiêu thì ít ai đo. Tôi đo, và đo cả một lỗi nghiêm trọng hơn chuyện chậm: OFFSET neo vào vị trí, mà vị trí thì đổi khi dữ liệu đổi.

Cơ sở dữ liệu 29/08/2026 10 phút

JSONB tốn gấp đôi chỗ, đếm chậm 38 lần, ghi tốn 6,6 lần WAL — và vẫn có đúng một chỗ nó là lựa chọn duy nhất

JSONB rất tiện: không cần ALTER TABLE, thêm trường lúc nào cũng được. Tôi dựng hai bảng cùng dữ liệu — một cột thường, một JSONB — để đo cái giá của sự tiện đó, và tìm ra ranh giới rõ ràng giữa lúc nên dùng và lúc phải trả giá đắt.

Cơ sở dữ liệu 29/08/2026 10 phút

Cột mảng nhỏ hơn bảng phụ 4 lần — nhưng tra một thẻ chậm 57 lần, và không khoá ngoại nào chặn được thẻ ma

PostgreSQL cho một cột chứa cả mảng hoặc cả bản ghi con, tránh được một bảng phụ và một phép nối. Tôi đo cái giá của việc tránh đó bằng bài toán gắn thẻ cho bài viết — gọn hơn thật, nhưng mất Index Only Scan, mất khoá ngoại, và dữ liệu mồ côi tích lại mà không gì phát hiện.

Cơ sở dữ liệu 29/08/2026 10 phút

Phân mảnh để truy vấn nhanh hơn thường là lý do sai — chỗ nó thắng áp đảo là xoá dữ liệu cũ

Phân mảnh bảng hay được giới thiệu như cách tăng tốc truy vấn trên bảng lớn. Tôi đo thì thấy nó khi nhanh khi chậm; lợi ích thật nằm ở chỗ khác hẳn — DROP một phân vùng sinh 181 kB WAL thay vì 312 MB của DELETE, và không để lại một dòng chết nào.