Cơ sở dữ liệu 28/08/2026 11 phút

Bộ tối ưu có ba thuật toán nối đều đúng — và vẫn chọn sai 800 lần vì thống kê cũ

PostgreSQL có đúng ba cách nối hai bảng. Tôi ép chạy cả ba trên cùng truy vấn để xem chúng chênh nhau bao nhiêu, tìm ra một dải mà lựa chọn của bộ tối ưu không phải nhanh nhất, và một lần thiếu thống kê làm truy vấn chậm 800 lần mà không báo lỗi.

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

Cùng một CTE: 226 ms trên PostgreSQL 11, 0,07 ms trên 16 — và bản 'sửa' đó lại làm vài mã cũ chậm đi

Nhiều năm liền, WITH của PostgreSQL là một hàng rào tối ưu không chuẩn SQL nào đòi hỏi: điều kiện lọc bên ngoài không được đẩy vào trong. PostgreSQL 12 đổi điều đó. Tôi dựng cả hai phiên bản với dữ liệu giống hệt để đo, và chỉ ra vì sao 'sửa' một hành vi tình cờ lại là một thay đổi phá vỡ.

Spring 21/07/2026 7 phút

Một dòng findAll() là đỉnh tảng băng — chốt chặng dữ liệu và bốn thói quen nhìn xuống dưới mặt nước

ORM giấu việc truy cập CSDL quá giỏi, và mọi vấn đề tốn kém của tầng dữ liệu nằm đúng ở chỗ nó giấu. Bảng quyết định rút từ bảy phép đo thật, ba dòng cấu hình đáng đặt vào mọi dự án, và bốn thói quen đáng mang theo.

Spring 17/07/2026 7 phút

Pool lớn hơn không nhanh hơn — và khi cạn pool, request không xếp hàng mà bị ném ngoại lệ

Pool kết nối như một đội xe chung của công ty: ký mượn một chiếc, chạy việc, ký trả; hết xe thì bị từ chối chứ không xếp hàng vô hạn. Vì sao đội xe đông hơn không chạy việc nhanh hơn, bốn tham số HikariCP, và nguyên nhân thật của cạn pool.

Spring 16/07/2026 8 phút

Sửa một dòng chú thích trong migration cũ và ứng dụng từ chối khởi động — vì sao đó là tính năng

Migration lược đồ như cuốn nhật ký chỉ-thêm: mỗi bước một mục đánh số, chạy lại theo thứ tự là ra đúng lược đồ hôm nay, mục đã viết thì niêm lại. Vì sao ddl-auto update không phải chiến lược, và cách đổi lược đồ không dừng dịch vụ.