Tôi đã xác nhận chỉ mục hoạt động như mong đợi.
Tôi đã tạo lại dữ liệu ngẫu nhiên, chỉ lần này đặt diet_glutenfree
thành random() > 0.9
vì vậy chỉ có 10% cơ hội có on
bit.
Sau đó, tôi đã tạo lại các chỉ mục và thử lại truy vấn.
SELECT RecipeId from RecipeMetadata where diet_glutenfree;
Lợi nhuận:
'Index Scan using idx_recipemetadata_glutenfree on recipemetadata (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'
Và:
SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;
Lợi nhuận:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'
Có vẻ như nỗ lực đầu tiên của tôi đã bị ô nhiễm vì PG ước tính việc quét toàn bộ bảng sẽ nhanh hơn thay vì đạt được chỉ mục nếu nó vẫn phải tải hơn một nửa số hàng.
Tuy nhiên, tôi nghĩ rằng tôi sẽ nhận được những kết quả chính xác này trên một chỉ mục đầy đủ của cột. Có cách nào để xác minh số hàng được lập chỉ mục trong chỉ mục một phần không?
CẬP NHẬT
Chỉ số khoảng 40k. Tôi đã tạo một chỉ mục đầy đủ của cùng một cột và nó hơn 200 nghìn, vì vậy có vẻ như nó chắc chắn là một phần.