Ba node này là ba cách khác nhau để lấy dòng ra khỏi bảng, khác nhau ở mẫu truy cập đĩa.
Seq Scan — đọc toàn bộ bảng tuần tự theo thứ tự trang. Không cần index. Nhanh nhất khi phải lấy phần lớn bảng, vì đọc tuần tự rẻ hơn nhiều so với đọc ngẫu nhiên.
Index Scan — đi qua B-tree, với mỗi entry khớp thì nhảy về bảng lấy dòng. Mỗi lần nhảy là một truy cập ngẫu nhiên. Tối ưu khi số dòng khớp rất ít hoặc khi cần dữ liệu đã sắp xếp sẵn theo index.
Bitmap Heap Scan — đứng giữa hai loại trên, luôn đi kèm node con Bitmap Index Scan:
1. Quét index, đánh dấu vào một bitmap các trang chứa dòng khớp (chưa đọc bảng).
2. Sắp xếp bitmap theo thứ tự trang vật lý, rồi đọc bảng một lượt theo thứ tự đó.
Nhờ vậy mỗi trang chỉ đọc một lần và đọc gần như tuần tự, thay vì nhảy ngẫu nhiên nhiều lần vào cùng một trang.
Bitmap Heap Scan on orders (rows=41200)
Recheck Cond: (customer_id = 42)
Heap Blocks: exact=3891
-> Bitmap Index Scan on idx_orders_customer (rows=41200)Khi nào chọn bitmap: số dòng khớp ở mức trung bình — quá nhiều cho index scan, quá ít cho seq scan. Ngoài ra bitmap là cách duy nhất để kết hợp nhiều index trong một truy vấn (BitmapAnd / BitmapOr).
Dòng Recheck Cond xuất hiện vì khi bitmap quá lớn nó chuyển sang chế độ lossy (chỉ nhớ trang, không nhớ dòng) nên phải kiểm lại điều kiện sau khi đọc trang.