Qu'est-ce qu'une «analyse de tas Bitmap» dans un plan de requête?

113

Je veux connaître le principe de "l'analyse de tas Bitmap", je sais que cela arrive souvent lorsque j'exécute une requête avec ORdans la condition.

Qui peut expliquer le principe d'un "scan de tas Bitmap"?

francs
la source

Réponses:

122

La meilleure explication vient de Tom Lane , qui est l'auteur de l'algorithme sauf si je me trompe. Voir aussi l' article wikipedia .

Bref, c'est un peu comme un seq scan. La différence est que, plutôt que de visiter chaque page de disque, un index bitmap scanne les ET et les OU les index applicables ensemble, et ne visite que les pages de disque dont il a besoin.

Ceci est différent d'une analyse d'index, où l'index est visité ligne par ligne dans l'ordre - ce qui signifie qu'une page de disque peut être visitée plusieurs fois.


Re: la question dans votre commentaire ... Ouais, c'est exactement ça.

Une analyse d'index parcourra les lignes une par une, ouvrant les pages du disque encore et encore, autant de fois que nécessaire (certaines resteront bien sûr en mémoire, mais vous comprenez bien).

Une analyse d'index bitmap ouvrira séquentiellement une courte liste de pages de disque et récupérera chaque ligne applicable dans chacune d'elles (d'où la soi-disant recheck cond que vous voyez dans les plans de requête).

Notez, en passant, comment le regroupement / l'ordre des lignes affecte les coûts associés avec l'une ou l'autre méthode. Si les lignes sont partout dans un ordre aléatoire, un index bitmap sera moins cher. (Et, en fait, s'ils sont vraiment partout , un scan seq sera le moins cher, car un scan d'index bitmap n'est pas sans frais généraux.)

Denis de Bernardy
la source
Donc, "Bitmap heap scan": Une page ne peut pas être visitée plus d'une fois! mais "Index Can": Une page peut être visitée plus d'une fois, car l'index est visité ligne par ligne dans l'ordre.
francs
Il y a probablement une mise en cache impliquée lorsque les pages sont visitées plusieurs fois: la page sera en fait chargée à partir du disque la première fois (lente), et un accès ultérieur atteindra le cache en mémoire (cache Postgres (rapide) ou cache du système d'exploitation (plus rapide)) .
Matthieu
Il y a aussi le index-only scanmoment où seule la colonne indexée est accessible dans la requête. dans ce cas, index-only scann'a pas besoin d'accéder aux données du tas (page de données): postgresql.org/docs/12/indexes-index-only-scans.html
Alan