Pour chaque version de Postgres prenant en charge l' indexation de hachage , un avertissement ou une note indique que les index de hachage sont "similaires ou plus lents" ou "pas meilleurs" que les index btree , du moins jusqu'à la version 8.3. De la documentation:
Remarque: En raison de l'utilité limitée des index de hachage, un index B-tree doit généralement être préféré à un index de hachage. Nous n'avons pas suffisamment de preuves que les indices de hachage sont en fait plus rapides que les arbres B, même pour les comparaisons =. De plus, les index de hachage nécessitent des verrous plus grossiers; voir Section 9.7.
Version 7.3 (et jusqu'à 8.2) :
Remarque: Les tests ont montré que les index de hachage de PostgreSQL sont similaires ou plus lents que les index B-tree, et la taille de l'index et le temps de construction pour les index de hachage sont bien pires. Les indices de hachage souffrent également de mauvaises performances dans des conditions de concurrence élevée. Pour ces raisons, l'utilisation de l'index de hachage est déconseillée.
Remarque: Les tests ont montré que les index de hachage de PostgreSQL ne fonctionnent pas mieux que les index B-tree, et la taille d'index et le temps de construction pour les index de hachage sont bien pires. De plus, les opérations d'index de hachage ne sont pas actuellement enregistrées en WAL, il peut donc être nécessaire de reconstruire les index de hachage avec REINDEX après un crash de la base de données. Pour ces raisons, l'utilisation de l'indice de hachage est actuellement déconseillée.
Dans ce thread de la version 8.0 , ils affirment n'avoir jamais trouvé de cas où les index de hachage étaient en fait plus rapides que btree.
Même dans la version 9.2, le gain de performances pour autre chose que l'écriture de l'index réel n'était presque rien selon ce billet de blog (14 mars 2016):
Hash Indexes on Postgres d'André Barbosa.
Ma question est comment est-ce possible?
Par définition, les index Hash sont une O(1)
opération, où un btree est une O(log n)
opération. Alors, comment est-il possible pour une O(1)
recherche d'être plus lente que (ou même similaire à) de trouver la bonne branche, puis de trouver le bon enregistrement?
Je veux savoir ce que la théorie de l'indexation pourrait JAMAIS en faire!