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

Multi-row INSERT và batch trong PostgreSQL: kích thước lô tối ưu, lợi ích giảm dần

Gộp nhiều dòng vào một câu INSERT VALUES giảm round-trip mạng và chi phí lặp lại. Đo thật nạp 100k dòng: lô 1 dòng mất 8,49 giây, lô 50 chỉ 0,32 giây (nhanh 26 lần), nhưng từ lô 500 trở lên lợi ích giảm dần rõ rệt (0,16 so với 0,14 giây). Điểm ngọt là 500-1000 dòng mỗi lô. Khi nào dùng thay COPY. PostgreSQL 16.

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

UPSERT trong PostgreSQL: ON CONFLICT làm chèn-hoặc-cập-nhật atomic, không dính race

INSERT ... ON CONFLICT gộp chèn và cập nhật vào một câu lệnh atomic — thay cho SELECT-rồi-ghi vừa chậm vừa dính race condition. Đo thật: UPSERT một câu nhanh 2,1 lần, mệnh đề WHERE xoá 50.000 dead tuple, và bẫy 'cannot affect row a second time'. PostgreSQL 16.

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

Cập nhật và xoá hàng loạt trong PostgreSQL: vì sao chia lô chậm hơn mà vẫn nên làm

Một UPDATE/DELETE khổng lồ nhanh hơn về wall-clock nhưng khoá mọi dòng suốt cả giao dịch, dồn hàng trăm MB WAL một cục và phình bảng gần gấp đôi. Đo thật: UPDATE 2 triệu dòng sinh 722 MB WAL và 2 triệu dead tuple; chia lô kèm VACUUM giữ bloat thấp. PostgreSQL 16.

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

Nạp dữ liệu lớn vào PostgreSQL: vì sao bỏ index rồi tạo lại nhanh gần gấp đôi

Mỗi index phải cập nhật theo từng dòng chèn, nên nạp khối lượng lớn vào bảng đã đầy index rất chậm. Đo thật: nạp 3 triệu dòng với 4 index sẵn mất 12,6 giây; bỏ index thứ cấp rồi tạo lại sau khi nạp chỉ 7 giây và bảng còn nhỏ hơn. Và một điểm bất ngờ về maintenance_work_mem. PostgreSQL 16.

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

TRUNCATE vs DELETE trong PostgreSQL: nhanh hơn 34 lần, và những khác biệt dễ vấp

TRUNCATE vứt cả tệp dữ liệu nên gần như tức thời và trả chỗ ngay; DELETE quét từng dòng, để lại dead tuple và bảng không nhỏ lại. Đo thật: làm rỗng bảng 3 triệu dòng mất 678 ms với DELETE so với 20 ms với TRUNCATE. Cùng khác biệt về giao dịch, sequence và trigger. PostgreSQL 16.