Dùng đường bulk-load gốc của database (COPY của Postgres, của MySQL), chia file thành các chunk nạp vào một đã index và constraint, rồi rebuild index một lần và merge — và làm cả job để khi crash có thể chạy lại mà không nhân đôi dữ liệu.
Dùng đường bulk-load gốc của database (COPY của Postgres, của MySQL), chia file thành các chunk nạp vào một đã index và constraint, rồi rebuild index một lần và merge — và làm cả job để khi crash có thể chạy lại mà không nhân đôi dữ liệu.
LOAD DATA100M-row CSV
│ split by byte offset
▼
[chunk 1] [chunk 2] ... [chunk N] N parallel workers
│ │ │
└──── COPY / LOAD DATA (no indexes) ────▶ staging_table (UNLOGGED)
│
rebuild indexes + validate
│
INSERT ... SELECT (upsert) into target
Một INSERT cho mỗi dòng phải trả một round-trip, một lần parse, một lần ghi WAL/redo và một lần cập nhật index — lặp lại 100 triệu lần. Chỉ 1ms mỗi lần thôi cũng đã hơn một ngày. Đường bulk thắng nhờ phân bổ đều tất cả chi phí đó: COPY stream các dòng trong một message của protocol, gộp batch WAL, và bỏ qua bước lập kế hoạch cho từng câu lệnh. Trên phần cứng thật, một COPY đạt 100k–500k dòng/s so với vài nghìn của INSERT.
UNLOGGED trong Postgres bỏ WAL hoàn toàn), đừng bao giờ nạp thẳng vào bảng live. Việc này cách ly quá trình load khỏi reader và cho phép validate trước khi publish.CREATE INDEX một lần — dựng index theo lô (đã sort) rẻ hơn nhiều so với 100M lần cập nhật tăng dần.COPY. Throughput tăng theo I/O và CPU cho tới khi bão hoà disk hoặc WAL. Chọn N theo số core/IOPS, không phải "càng nhiều càng tốt".INSERT ... ON CONFLICT DO NOTHING/UPDATE (upsert) để chạy lại không bao giờ chèn trùng.Người phỏng vấn dò xem bạn có biết đường bulk tồn tại và vì sao nó nhanh gấp nhiều bậc — không phải cú pháp COPY. Khá: "dùng COPY". Xuất sắc: "COPY vào staging table UNLOGGED, drop index, chunk song song, rebuild sau, upsert để publish, resume theo chunk id." Bẫy kinh điển là loop INSERT (hoặc saveAll của ORM) rồi ngạc nhiên vì mất hàng giờ; bẫy thứ hai là nạp thẳng vào bảng live và làm nghẽn production.
maintenance_work_mem/không gian temp; dựng index 100M dòng có thể tràn ra disk.Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ