Comment choisir et optimiser oracle indices? [fermé]

j'aimerais savoir s'il existe des règles générales pour créer un index ou non. Comment choisir les champs que je dois inclure dans cet index ou quand ne pas les inclure?

je sais que cela dépend toujours de l'environnement et de la quantité de données, mais je me demandais si nous pouvions faire quelques règles acceptées mondialement sur la réalisation des index dans Oracle.

28
demandé sur Brian Tompsett - 汤莱恩 2008-10-17 18:01:59
la source

6 ответов

la documentation D'Oracle a un excellent ensemble de considérations pour les choix d'indexation: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

citant:

  • envisager des clés d'indexation qui sont utilisées fréquemment dans les clauses WHERE.

  • envisager des clés d'indexation qui sont utilisés fréquemment pour joindre des tables en SQL déclaration. Pour plus d'informations sur l'optimisation des jointures, consultez la section "Utilisation des Clusters de hachage pour la Performance".

  • choisir des touches d'index à haute sélectivité. La sélectivité d'un indice est le pourcentage de lignes dans un tableau ayant la même valeur pour la clé indexée. La sélectivité d'un indice est optimale si peu de lignes ont la même valeur. Note: Oracle crée automatiquement des index, ou utilise des index existants, sur les clés et les expressions d'unique et les clés primaires que vous définissez avec des contraintes d'intégrité. L'indexation des colonnes de faible sélectivité peut être utile si la distribution des données est faussée de sorte qu'une ou deux valeurs se produisent beaucoup moins souvent que d'autres valeurs.

  • n'utilisez pas les index d'arbre B standard sur les clés ou les expressions avec peu de valeurs distinctes. Ces clés ou expressions ont généralement une faible sélectivité et ne permettent donc pas d'optimiser les performances à moins que les valeurs clés fréquemment sélectionnées ne semblent moins fréquemment que les autres des valeurs clés. Vous pouvez utiliser efficacement les index bitmap dans de tels cas, à moins que l'index ne soit modifié fréquemment, comme dans une application OLTP à haute simultanéité.

  • ne pas indexer les colonnes qui sont modifiées fréquemment. Mettre à jour les énoncés qui modifient les colonnes indexées et insérer et supprimer les énoncés qui modifient les tableaux indexés prennent plus de temps que s'il n'y avait pas d'index. Ces instructions SQL doivent modifier les données dans les index aussi bien que les données dans table. Ils génèrent également des défaites et des Redos supplémentaires.

  • ne pas indexer les touches qui apparaissent seulement dans les clauses avec des fonctions ou des opérateurs. Une clause WHERE qui utilise une fonction, autre que MIN ou MAX, ou un opérateur avec une clé indexée ne rend pas disponible le chemin d'accès qui utilise l'index sauf avec des index basés sur la fonction.

  • envisager l'indexation des clés étrangères des contraintes d'intégrité référentielle dans les cas où un grand nombre D'insertions, de mises à jour et de suppressions simultanées ont accès aux tables parent et enfant. Un tel index permet des mises à jour et des suppressions sur la table parent sans partage verrouiller la table enfant.

  • lorsque vous choisissez d'indexer une clé, examinez si le gain de performance pour les requêtes vaut la perte de performance pour les INSERTs, les mises à jour et les suppressions et l'utilisation de l'espace requis pour stocker l'index. Vous pourriez vouloir expérience en comparant les temps de traitement des instructions SQL avec et sans index. Vous pouvez mesurer le temps de traitement avec L'installation de trace SQL.

52
répondu David Aldridge 2008-10-17 23:56:19
la source

il y a certaines choses que vous devriez toujours indexer:

  • clés primaires - celles-ci sont données un index automatiquement (à moins que vous spécifiez un index existant approprié pour Oracle à utiliser)
  • Clés uniques - celles-ci sont données un index automatiquement (ditto)
  • clés étrangères - celles-ci sont pas indexées automatiquement, mais vous devriez en ajouter une pour éviter les problèmes de performance lorsque les contraintes sont cochées

après cela, cherchez d'autres colonnes qui sont fréquemment utilisées pour filtrer les requêtes: un exemple typique est les noms de famille des gens.

10
répondu Tony Andrews 2008-10-20 21:59:00
la source

à Partir de la Base de données Oracle 10g les Développeurs d'Application du Guide - principes Fondamentaux, Chapitre 5:

En général, vous devez créer un index sur une colonne dans l'une des situations suivantes:

  • la colonne est fréquemment interrogée.
  • Une contrainte d'intégrité référentielle existe sur la colonne.
  • une contrainte d'intégrité clé UNIQUE existe sur la colonne.

utiliser les lignes directrices suivantes pour déterminer le moment de créer un indice:

  • créez un index si vous souhaitez fréquemment récupérer moins de 15% des lignes dans une grande table. Ce pourcentage de seuil varie cependant beaucoup, selon la vitesse relative d'un balayage de tableau et la façon dont les données de ligne sont regroupées par rapport à la clé d'index. Plus le balayage de la table est rapide, plus le pourcentage est faible; plus les données sont regroupées, plus le pourcentage est élevé.
  • colonnes D'Index qui sont utilisées pour les jointures pour améliorer les performances de jointure.
  • les clés primaires et uniques ont automatiquement des index, mais vous pourriez vouloir créer un index sur une clé étrangère; voir le Chapitre 6, "maintenir L'intégrité des données dans le développement de L'Application" pour plus d'informations.
  • les petites tables n'ont pas besoin d'index; si une requête prend trop de temps, alors la table peut être passée de petite à grande.

Certains les colonnes sont de bons candidats pour l'indexation. Colonnes, avec une ou plusieurs des caractéristiques suivantes sont de bons candidats pour l'indexation:

  • les valeurs sont uniques dans la colonne, ou il y a peu de doublons.
  • il existe une large gamme de valeurs (bonne pour les indices réguliers).
  • il y a une petite plage de valeurs (bonne pour les index bitmap).
  • la colonne contient beaucoup de nulls, mais les requêtes souvent sélectionnez toutes les lignes ayant une valeur. Dans ce cas, une comparaison qui correspond à toutes les valeurs non nulles, telles que:

    où COL_X >= -9,99 * puissance (10,125) est préférable de OÙ COL_X N'EST PAS NULL

    c'est parce que le premier utilise un index sur COL_X (en supposant que COL_X est une colonne numérique).

les colonnes présentant les caractéristiques suivantes sont moins aptes à l'indexation:

  • il y a beaucoup de nulls dans la colonne et vous ne faites pas de recherche sur les valeurs non nulles.
4
répondu DCookie 2008-10-17 20:40:52
la source

Wow, c'est un vaste sujet, il est difficile de répondre dans ce format. Je recommande vivement ce Livre .

conception de L'Index de la base de données relationnelle et les optimiseurs par Tapio Lahdenmaki

vous n'utilisez pas seulement des index pour rendre l'accès à la table plus rapide, parfois vous faites des index pour éviter l'accès à la table tout à fait. Quelque chose qui n'est pas encore mentionné mais qui est vital.

il y a toute une science à cela si vous je veux vraiment que votre base de données fonctionne au maximum.

Ah, une optimisation spécifique à Oracle est la construction des index de clés inversées. Si vous avez un index PK d'une valeur monoatomiquement croissante, comme une séquence, et que vous avez des inserts très concurrents et que vous n'avez pas l'intention de scanner la portée de cette colonne, alors faites-en un index de touche inverse.

voyez comment ces optimisations peuvent être spécifiques?

2
répondu 2008-10-17 21:36:29
la source

regardez dans la normalisation de base de données - vous trouverez beaucoup de bonnes, règles standard de l'industrie sur ce que les clés devraient exister, comment les bases de données devraient être liés, et des conseils sur les index.

- Adam

1
répondu Adam Davis 2008-10-17 19:07:41
la source

habituellement, on place les colonnes D'identification à l'avant et celles-ci identifient habituellement les lignes de façon unique. Une combinaison de colonnes peut aussi faire la même chose. Comme exemple d'utilisation de voitures... les étiquettes ou les plaques d'immatriculation sont uniques et se qualifient pour un index. Ils (les étiquettes de colonne) peuvent se qualifier pour la clé primaire. Le nom des propriétaires peuvent se qualifier pour un indice si vous allez à la recherche sur le nom. marque de voiture vraiment ne devrait pas obtenir un indice au début, car il ne va pas varier trop. Les index n'aident pas si les données de la colonne ne varient pas trop.

jetez un oeil à la SQL - quelles sont les clauses où regarder. Ceux - ci peuvent avoir besoin d'un index.

mesure. Quel est le problème - les pages/requêtes prennent trop de temps ? ce qui est utilisé pour les requêtes. Créez un index sur ces colonnes.

mises en garde: les index ont besoin de temps pour les mises à jour et d'espace.

et parfois des balayages complets sont plus rapides qu'un index. petites tables peut être scanné plus rapidement que l'obtention de l'index et ensuite frapper la table. Regardez vos jointures.

0
répondu jim 2008-10-17 18:14:33
la source

Autres questions sur