Statistics và ANALYZE - Thống kê cũ: Kẻ phá hoại ngầm

Database lưu thống kê (statistics) về mỗi cột: bao nhiêu giá trị khác nhau (distinct values), phân phối giá trị (histogram), tổng số row… - Cost model dựa hoàn toàn vào những con số này.

Vấn đề: thống kê cũ

Thống kê được tính dựa trên mẫu (sample) từ bảng, và chỉ được cập nhật khi vượt ngưỡng thay đổi nhất định. Sau bulk operations, thống kê có thể sai lệch nghiêm trọng:

Thực tế:    5% rows match query  → nên dùng index
Thống kê cũ: ước tính 55% match  → full table scan
→ Database đưa ra quyết định SAI!

Giải pháp: luôn chạy ANALYZE sau bulk changes

-- MySQL:
ANALYZE TABLE users;
 
-- PostgreSQL (SKIP_LOCKED tránh block concurrent queries):
ANALYZE users;

Statistics còn quyết định thứ tự JOIN

Optimizer dựa vào statistics để chọn driving table (Nested Loop Join): nếu thống kê cho thấy country='NR' chỉ match 2 departments → bắt đầu từ department nhanh hơn 170 lần. Thống kê sai → thứ tự join sai → query chậm hàng trăm lần.

Liên quan