La création d'Index pour le Groupe de Champs?
Avez-vous besoin pour créer un index pour les champs de groupe de champs dans une base de données Oracle?
Par exemple:
select *
from some_table
where field_one is not null and field_two = ?
group by field_three, field_four, field_five
J'étais test de l'index j'ai créé pour le dessus et le seul indice pertinent pour cette question est un indice créé pour field_two. D'autres à un seul champ ou composite index créés sur les autres champs ne seront pas utilisés pour la requête ci-dessus. Cela vous parait-il correct?
Vous devez vous connecter pour publier un commentaire.
Il pourrait être correct, mais cela dépendra de la quantité de données que vous avez. Généralement je voudrais créer un index pour les colonnes, j'ai été en utilisant dans un GROUPE, mais dans votre cas, l'optimiseur peut-être décidé qu'après l'utilisation de la field_two indice qu'il n'y aurait pas suffisamment de données retourné à justifier l'utilisation de l'indice pour le GROUPE PAR.
Pas, cela peut être incorrect.
Si vous avez une grande table,
Oracle
peut préférer dérivant les champs de l'index plutôt que de la table, de même il n'y a aucun indice unique qui couvre toutes les valeurs.Dans le dernier article de mon blog:
PAS
au lieu den'EXISTE PAS
au lieu deLEFT JOIN /NULL
:Oracle
il y a une requête dans laquelle
Oracle
ne pas utiliser de tableau d'analyse mais plutôt se joint à deux indices pour obtenir les valeurs de la colonne:Le plan est:
Comme vous pouvez le voir, il n'y a pas de
TABLE SCAN
surt_left
ici.Au lieu de cela,
Oracle
prend l'index surid
etvalue
, se joint à eux surrowid
et obtient le(id, value)
paires à partir de la jointure résultat.Maintenant, à votre requête:
Tout d'abord, il ne compile pas, puisque vous êtes en sélectionnant
*
à partir d'une table avec uneGROUP BY
clause.Vous avez besoin de remplacer
*
avec des expressions basées sur les colonnes de regroupement et des agrégats de la non-colonnes de regroupement.Vous aurez très probablement bénéficier de l'index suivant:
car il contient tous les éléments pour le filtrage sur
field_two
, le tri surfield_three, field_four, field_five
(utile pourGROUP BY
) et faire en sorte quefield_one
estNOT NULL
.@Eric Petroelje
: il existe un indice,INDEX_JOIN
, à la force de cette méthode.Pas. Vous n'avez pas besoin d', dans le sens où une requête s'exécute indépendamment de savoir si il existe des index ou pas. Les index sont fournis pour améliorer les performances des requêtes.
Il peut cependant être utile; mais j'avais hésitez pas à ajouter un index à l'aide d'une requête, sans penser à l'impact possible de le nouvel indice sur la base de données.
Pas toujours. Souvent un GROUPE PAR exigera Oracle d'effectuer un tri (mais pas toujours); et vous pouvez éliminer l'opération de tri en fournissant un adapté index sur la colonne(s) à trier.
Si vous avez réellement besoin de s'inquiéter à propos du GROUPE PAR la performance, cependant, est une question importante pour vous de penser.