Question

La création d'un index pour une colonne en cours de sommation est-elle plus rapide qu'aucun index?

Était-ce utile?

La solution

Désolé, ce que vous demandez n'est pas clair.

Demandez-vous, cela accélérerait-il une requête telle que

SELECT product, sum(quantity) FROM receipts 
GROUP BY product

si vous avez ajouté un index sur la quantité?

Si telle est la question, la réponse est non. En règle générale, les index sont utiles lorsque vous devez rechercher quelques lignes parmi d'autres. ici vous avez besoin de toutes les lignes, donc un index n’aide pas.

Il existe une exception obscure (qui s'applique si rarement que la plupart des optimiseurs de base de données ne se donnent probablement pas la peine d'implémenter cette astuce). Si votre requête est

SELECT sum(foo) FROM bar

, où il y a un index sur foo, et bar est une table avec de nombreuses colonnes, il est possible de lire l’index complet, ce qui entraîne un plus petit succès que si vous lisiez la table sous-jacente, et obtenez la réponse directement à partir du index - ne jamais avoir à toucher le " réel " table du tout! Cependant, il s’agit d’un cas assez rare et vous voudrez peut-être vérifier que votre optimiseur sait le faire avant de trop vous fier à cela.

Autres conseils

Non. Les index améliorent les recherches en limitant le nombre de vérifications nécessaires. Une fonction d'agrégation (nombre, max, min, somme, moyenne) doit parcourir toutes les entrées d'une colonne, quel que soit le cas.

Si vous souhaitez accélérer la somme, vous pouvez préfabriquer le résultat. Sur Oracle, utilisez Vues matérialisées , sur MS SQL, utilisez Vues indexées .

Sur votre question spécifique "La création d'un index pour une colonne en cours de sommation est-elle plus rapide qu'aucun index?", la réponse est Non.

La réponse à votre question repose sur la réponse de Spencer:

"Une fonction d'agrégat (nombre, maximum, minimum, somme, moyenne) doit parcourir toutes les entrées d'une colonne faisant l'objet d'une sommation, quelle que soit".

Vient de clarifier le contexte des colonnes dans la réponse de Spencer. Sa réponse est néanmoins correcte.

Si l'index est couvrant, il sera généralement plus rapide. Combien plus rapidement sera déterminé par la différence entre le nombre de colonnes dans la table par rapport au nombre dans l'index. De plus, il pourrait être plus rapide s’il existe des critères de filtrage.

J'ai trouvé que l'indexation d'une colonne dans l'emplacement (productid here) aide à utiliser cette requête:

CHOISIR productid, somme (quantité) FROM recettes WHERE productid = 1 GROUP BY productid

Une de mes requêtes est passée de 45 secondes à presque instantanément une fois que j'ai ajouté l'index.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top