Cơ sở dữ liệu 22/09/2026 5 phút

Window function trong PostgreSQL: tính tổng hợp mà vẫn giữ từng dòng, và tối ưu chúng

Window function tính tổng hợp theo nhóm nhưng giữ nguyên mỗi dòng — thay thế self-join và subquery tương quan. Đo thật: bước tốn nhất là Sort theo PARTITION BY, một index khớp xóa hẳn nó, và gom các hàm cùng window để sắp một lần. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 6 phút

LATERAL join trong PostgreSQL: top-N mỗi nhóm gọn gàng, nhanh hơn window function

LATERAL cho subquery bên phải tham chiếu cột bảng bên trái — điều subquery thường trong FROM không làm được. Đo thật: lấy 3 đơn mới nhất mỗi khách bằng LATERAL + LIMIT + index chạy 158 ms, đọc 600 nghìn trang; window row_number phải quét cả 3 triệu dòng, 540 ms, 3 triệu trang. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 6 phút

Điều kiện OR làm mất index trong PostgreSQL: khi nào, vì sao, và cách cứu

OR không tự động giết index — nó chỉ nhanh bằng nhánh chậm nhất. Đo thật: OR trên hai cột có index cho BitmapOr 0,09 ms, nhưng chỉ một nhánh thiếu index kéo cả câu thành Seq Scan toàn bảng 48 ms. Và vì sao index gộp phục vụ AND mà không phục vụ OR. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 6 phút

Hàm bọc quanh cột làm mất index trong PostgreSQL: lower(), date() và cách gỡ

Index lưu giá trị cột, không lưu giá trị của hàm. Bọc lower(email) hay date(tao_luc) quanh cột trong WHERE khiến index thành vô dụng. Đo thật: lower(email) chạy Seq Scan 160 ms so với 0,036 ms; date(tao_luc) 47,6 ms so với 0,433 ms khi viết lại thành khoảng. Index biểu thức và điều kiện sargable. PostgreSQL 16.