Introduction
L'optimisation de Top K dans les bases de données signifie récupérer les K meilleures lignes, classées par une colonne ou une valeur spécifique. Cette opération semble être un problème de base que Postgres devrait résoudre facilement. Cependant, dans de nombreux déploiements de production Postgres, Top K s'avère être un défi.
Contexte Technique
Postgres utilise des arbres B pour résoudre les requêtes Top K. Les arbres B sont des structures triées, ce qui signifie que la récupération des résultats Top K est trivialement O(K). Cependant, les choses se compliquent lorsqu'il faut ajouter des filtres qui ne font pas partie de l'index.
Par exemple, si nous voulons récupérer les 10 lignes les plus récentes par timestamp avec un filtre sur la sévérité, Postgres doit soit utiliser l'index B-tree sur timestamp et parcourir l'index une entrée à la fois pour vérifier le filtre, soit scanner les lignes qui correspondent au filtre et perdre l'ordre, ce qui peut entraîner des requêtes lentes.
Analyse et Implications
L'ajout d'un index composite sur plusieurs colonnes peut résoudre le problème pour une requête spécifique, mais cela ne généralise pas bien pour d'autres requêtes. De plus, les indexes composites peuvent causer une inflation de stockage, des écritures plus lentes et des plans de requête difficiles à comprendre.
Les requêtes de recherche plein texte cassent également l'hypothèse que les filtres sont des prédicats simples qui peuvent être exprimés comme des conditions d'égalité ou de plage à l'intérieur d'un arbre B. Les requêtes de recherche plein texte nécessitent souvent l'utilisation d'index GIN, qui ne préservent pas l'ordre, ce qui oblige Postgres à décomposer la requête en phases et à effectuer des recherches coûteuses dans la table sous-jacente.
Perspective
Les bases de données de recherche pensent différemment à propos de Top K. Elles utilisent souvent des structures de données spécialisées conçues pour gérer efficacement les requêtes de recherche et les filtres. Les utilisateurs de Postgres doivent être conscients des limites de l'optimisation de Top K dans Postgres et envisager d'utiliser des bases de données ou des bibliothèques de recherche spécialisées pour les cas d'utilisation qui nécessitent des performances élevées pour les requêtes de recherche et de filtrage.