Impossible de répondre aux requêtes dans PostgreSQL en utilisant simplement les informations d'un index. Que la ligne soit visible ou non, du point de vue de la requête en cours d'exécution, elle est stockée dans la ligne principale elle-même. Ainsi, lorsque vous ajoutez un index à quelque chose, et d'exécuter une requête qui utilise, il y a deux étapes:
- Naviguer l'index pour déterminer quels blocs de données sont utilisés
- récupérer ces blocs et retourner les lignes correspondre à la requête
Il est donc possible que répondre à une requête avec un index puisse prendre plus de temps que d'aller directement aux blocs de données et d'aller chercher les lignes.Le cas le plus fréquent où cela se produit est si vous êtes en train de saisir une grande partie des données. Généralement, si plus de 20% de la table est utilisée, il est considéré comme rapide de l'accéder de manière séquentielle. Parfois, le planificateur pense que moins de 20% seront accessibles, donc l'indice est préféré, mais ce n'est pas vrai; C'est une façon d'ajouter un index peut ralentir une requête. C'est peut-être la situation que vous voyez, basée sur votre description - si les grandes plages touchent plus de la table que les estimations de l'optimiseur, l'utilisation d'un index peut être un ralentissement net. Pour comprendre cela, la base de données recueille des statistiques sur chaque colonne de chaque table, afin de déterminer si une condition WHERE particulière est suffisamment sélective pour utiliser un index. L'idée est que vous devez avoir sauvé autant de blocs en ne lisant pas toute la table que l'ajout de l'index E/S en plus de cela est toujours une victoire nette.
Ce calcul peut mal tourner, de sorte que vous finissez par faire plus d'E/S que si vous aviez simplement lu la table directement, dans quelques cas. La cause de la plupart d'entre eux apparaît si vous exécutez la requête en utilisant EXPLAIN ANALYZE. Si les valeurs "attendues" et les nombres "réels" sont très différentes, cela peut suggérer que l'optimiseur avait de mauvaises statistiques sur la table. Une autre possibilité est que l'optimiseur a simplement fait une erreur sur la sélectivité de la requête - il pensait que cela ne retournerait qu'un petit nombre de lignes, mais il restituerait la plus grande partie de la table. Ici encore, de meilleures statistiques sont la façon normale de commencer à travailler là-dessus. Si vous utilisez PostgreSQL 8.3 ou une version antérieure, la quantité de statistiques collectées est très faible par défaut.
Certaines charges de travail finissent par ajuster le paramètre ajustable random_page_cost, qui contrôle l'endroit où se produit cet échange entre index et table scan. C'est seulement quelque chose à considérer après que l'information de statistiques soit vérifiée cependant. Voir Tuning Your PostgreSQL Server pour une intro à plusieurs choses que vous pouvez ajuster ici.
Merci, mais il y a un problème, je parle d'un champ de date pour simplifier ma question, mais vraiment j'utilise deux champs de date pour filtrer dans différentes requêtes, une dans certaines requêtes, jamais dans les deux en même temps. Le problème que j'écris est présent dans les deux. Encore une chose, ces deux champs de date sont similaires, je veux dire que la différence est petite (secondes ou milisecondes). Avez-vous des urls d'héritage de table pour les données de séries chronologiques? –
Dans le scénario 1, comment faire les insertions ou les mises à jour sur la table enfant correcte? – AngerClown
* (minutes ou secondes) –