Je vais essayer d'expliquer mes malentendus à l'aide de l'exemple suivant.
Je ne comprenais pas les fondamentaux du Bitmap Heap Scan Node
. Considérons la requête dont SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
le plan est le suivant:
Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
-> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
-> Bitmap Index Scan on ix_cust_username (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
Index Cond: ((username)::text < 'user100'::text)
-> Bitmap Index Scan on customers_pkey (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
Index Cond: (customerid < 1000)
Ma compréhension de ce noeud :
Comme expliqué ici , les bitmap heap scan
blocs de table de lecture sont classés dans un ordre séquentiel, de sorte qu'ils ne génèrent pas de surcharge liée à un accès aléatoire à une table Index Scan
.
Une fois Index Scan
cela fait, PostgreSQL ne sait pas comment extraire les lignes de manière optimale, pour éviter les inutiles heap blocks reads
(ou hits
s’il existe un cache actif). Donc, pour le comprendre, il génère la structure ( Bitmap Index Scan
) appelée, bitmap
qui dans mon cas est générée en générant deux bitmaps des index et en effectuant BITWISE AND
. Comme le bitmap a été généré, il peut maintenant lire la table de manière optimale dans un ordre séquentiel, en évitant d’être inutile heap I/O-operations
.
C'est l'endroit où beaucoup de questions viennent.
QUESTION: Nous avons juste un bitmap. Comment PostgreSQL sait-il par un bitmap quoi que ce soit sur l'ordre physique des lignes? Ou génère le bitmap de sorte que n'importe quel élément de celui-ci puisse être mappé au pointeur sur une page facilement? Si c'est le cas, cela explique tout, mais je ne fais que deviner.
Alors, pouvons-nous simplement dire que cela bitmap heap scan -> bitmap index scan
ressemble à une analyse séquentielle mais uniquement à la partie appropriée de la table?
001001010101011010101
. Ou alors, cela n’a pas d’importance et tout ce que nous avons à savoir, c’est que nous pouvons trouver un bloc en mode bitmap assez rapidement ...?