Saya telah mengonfirmasi bahwa indeks berfungsi seperti yang diharapkan.
Saya membuat ulang data acak, hanya kali ini set diet_glutenfree
ke random() > 0.9
jadi hanya ada 10% kemungkinan on
sedikit.
Saya kemudian membuat ulang indeks dan mencoba kueri lagi.
SELECT RecipeId from RecipeMetadata where diet_glutenfree;
Pengembalian:
'Index Scan using idx_recipemetadata_glutenfree on recipemetadata (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'
Dan:
SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;
Pengembalian:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'
Tampaknya upaya pertama saya tercemar karena PG memperkirakan lebih cepat untuk memindai seluruh tabel daripada menekan indeks jika harus memuat lebih dari setengah baris.
Namun, saya pikir saya akan mendapatkan hasil yang tepat ini pada indeks penuh kolom. Apakah ada cara untuk memverifikasi jumlah baris yang diindeks dalam indeks parsial?
PERBARUI
Indeksnya sekitar 40k. Saya membuat indeks lengkap dari kolom yang sama dan jumlahnya lebih dari 200 ribu, jadi sepertinya itu pasti sebagian.