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.

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

Nạp một triệu dòng: COPY nhanh gấp 112 lần chèn từng dòng — nhưng bước nhảy lớn nhất không nằm ở COPY

Nạp dữ liệu là việc ai cũng phải làm và ít ai đo. Tôi nạp cùng một triệu dòng bằng năm cách, và tìm ra rằng cách nhanh nhất không phải cách đáng khuyên nhất — cú tăng 40 lần nằm ở gộp lô, thứ chạy được ở mọi nơi COPY không dùng được.

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

Cách 'kiểm tra rồi ghi' chạy đúng mọi lần tôi thử — rồi sáu tiến trình cùng chạy, nó sai cả 25/25 vòng

'Có thì cập nhật, chưa có thì chèn' là thao tác quen thuộc nhất mà SQL chuẩn không có cú pháp riêng. Cách viết tay chạy đúng khi bạn thử một luồng và hỏng khi có nhiều tiến trình. Tôi đo cả hai — cùng ba cái bẫy và ba tính năng ít dùng của ON CONFLICT.

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

CHECK gần như miễn phí, nhưng xoá một dòng cha mà quên chỉ mục thì chậm 120 lần

Ràng buộc là cách rẻ nhất để dữ liệu không hỏng, nhưng 'rẻ' là từ định tính. Tôi gán số cho từng loại: CHECK và NOT NULL gần như miễn phí, khoá ngoại làm chèn chậm 6,2 lần — và cái bẫy lớn nhất là chi phí của nó hiện ra ở một thao tác bạn không ngờ tới.

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

Một trigger có thân hàm rỗng làm chèn chậm 35% — và một trigger khác nuốt mất nửa dữ liệu, không báo lỗi

Trigger là đoạn mã chạy tự động mỗi khi dữ liệu thay đổi: tiện vì không thể quên, khó vì nó chạy vô hình. Tôi đo chi phí của nó và dựng lại bốn tình huống nó cho kết quả ngoài dự đoán — gồm một chỗ làm mất nửa dữ liệu mà lệnh vẫn báo thành công.