web-dev-qa-db-fra.com

Comment choisir et optimiser les index Oracle?

Je voudrais savoir s'il existe ou non des règles générales pour créer un index. Comment choisir les champs à 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 établir des règles mondialement acceptées sur la création d'index dans Oracle.

28
guigui42

La documentation Oracle contient 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:

  • Envisagez d'indexer les clés fréquemment utilisées dans les clauses WHERE.

  • Envisagez d'indexer les clés fréquemment utilisées pour joindre des tables dans des instructions SQL. Pour plus d'informations sur l'optimisation des jointures, reportez-vous à la section "Utilisation des clusters de hachage pour les performances".

  • Choisissez des clés d'index qui ont une sélectivité élevée. La sélectivité d'un index est le pourcentage de lignes dans une table ayant la même valeur pour la clé indexée. La sélectivité d'un index est optimale si quelques lignes ont la même valeur. Remarque: Oracle crée automatiquement des index, ou utilise des index existants, sur les clés et expressions de clés uniques et primaires que vous définissez avec des contraintes d'intégrité. L'indexation des colonnes à faible sélectivité peut être utile si la distribution des données est asymétrique de sorte qu'une ou deux valeurs apparaissent beaucoup moins souvent que les autres valeurs.

  • N'utilisez pas d'index B-tree standard sur des clés ou des expressions avec peu de valeurs distinctes. De telles clés ou expressions ont généralement une mauvaise sélectivité et n'optimisent donc pas les performances à moins que les valeurs de clé fréquemment sélectionnées apparaissent moins fréquemment que les autres valeurs de clé. Vous pouvez utiliser les index bitmap efficacement dans de tels cas, sauf si l'index est modifié fréquemment, comme dans une application à concurrence élevée OLTP application.

  • N'indexez pas les colonnes qui sont fréquemment modifiées. Les instructions UPDATE qui modifient les colonnes indexées et les instructions INSERT et DELETE qui modifient les tables indexées prennent plus de temps que s'il n'y avait pas d'index. Ces instructions SQL doivent modifier les données des index ainsi que les données des tables. Ils génèrent également des annulations et des rétablissements supplémentaires.

  • N'indexez pas les clés qui apparaissent uniquement dans les clauses WHERE 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 les index basés sur des fonctions.

  • Envisagez d'indexer des clés étrangères de contraintes d'intégrité référentielle dans les cas où un grand nombre d'instructions INSERT, UPDATE et DELETE simultanées accèdent aux tables parent et enfant. Un tel index autorise les mises à jour et les suppressions sur la table parent sans partager le verrouillage de la table enfant.

  • Lorsque vous choisissez d'indexer une clé, déterminez si le gain de performances pour les requêtes vaut la perte de performances pour les INSERT, UPDATE et DELETE et l'utilisation de l'espace requis pour stocker l'index. Vous voudrez peut-être expérimenter en comparant les temps de traitement des instructions SQL avec et sans index. Vous pouvez mesurer le temps de traitement avec la fonction de trace SQL.

52
David Aldridge

Il y a certaines choses que vous devez toujours indexer:

  • Clés primaires - elles reçoivent automatiquement un index (sauf si vous spécifiez un index existant approprié à utiliser par Oracle)
  • Clés uniques - elles reçoivent automatiquement un index (idem)
  • Clés étrangères - elles sont pas automatiquement indexées, mais vous devez en ajouter une pour éviter les problèmes de performances lorsque les contraintes sont vérifiées

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

10
Tony Andrews

Extrait du 10g Oracle Database Application Developers Guide - Fundamentals, Chapter 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é de clé UNIQUE existe sur la colonne.

Utilisez les instructions suivantes pour déterminer quand créer un index:

  • Créez un index si vous souhaitez fréquemment récupérer moins d'environ 15% des lignes d'une grande table. Cependant, ce pourcentage seuil varie considérablement en fonction de la vitesse relative d'une analyse de table et de la façon dont les données de ligne sont regroupées par rapport à la clé d'index. Plus l'analyse de la table est rapide, plus le pourcentage est faible; plus les données de ligne sont regroupées, plus le pourcentage est élevé.
  • Colonnes d'index utilisées pour les jointures afin d'améliorer les performances des jointures.
  • Les clés primaires et uniques ont automatiquement des index, mais vous souhaiterez peut-être créer un index sur une clé étrangère; voir Chapitre 6, "Maintien de l'intégrité des données dans le développement d'applications" pour plus d'informations.
  • Les petites tables ne nécessitent pas d'index; si une requête prend trop de temps, la table peut être passée de petite à grande.

Certaines colonnes sont de bons candidats pour l'indexation. Les colonnes présentant 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 un large éventail de valeurs (bon pour les index réguliers).
  • Il existe une petite plage de valeurs (bonne pour les index bitmap).
  • La colonne contient de nombreux null, mais les requêtes sélectionnent souvent toutes les lignes ayant une valeur. Dans ce cas, une comparaison qui correspond à toutes les valeurs non nulles, telles que:

    OERE COL_X> = -9,99 * puissance (10 125) est préférable à O WH COL_X IS NOT NULL

    En effet, 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 adaptées à l'indexation:

  • Il y a beaucoup de valeurs nulles dans la colonne et vous ne recherchez pas les valeurs non nulles.
4
DCookie

Wow, c'est juste un sujet tellement énorme, il est difficile de répondre dans ce format. Je recommande vivement ceci livre .

Conception d'index de base de données relationnelle et optimiseurs par Tapio Lahdenmaki

Vous n'utilisez pas seulement des index pour accélérer l'accès à la table, parfois vous créez des index pour éviter complètement l'accès à la table. Quelque chose qui n'est pas encore mentionné mais qui est vital.

Il y a toute une science à cela si vous voulez vraiment faire fonctionner votre base de données au maximum.

Ah, une optimisation spécifique à Oracle consiste à créer des index à clé inversée. Si vous avez un index PK d'une valeur monoatomiquement croissante, comme une séquence, et que vous avez des insertions hautement simultanées et que vous ne prévoyez pas de parcourir cette colonne, faites-en un index à clé inversée.

Vous voyez à quel point ces optimisations peuvent être spécifiques?

2
Mark Brady

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

-Adam

1
Adam Davis

Habituellement, on place les colonnes d'identification à l'avant et celles-ci identifient généralement les lignes de manière unique. Une combinaison de colonnes peut également faire la même chose. Par exemple, en utilisant des voitures ... les étiquettes ou les plaques d'immatriculation sont uniques et qualifiées pour un index. Ils (la colonne des balises) peuvent se qualifier pour la clé primaire. Le nom du propriétaire peut se qualifier pour un index si vous cherchez un nom. make of car ne devrait vraiment pas avoir d'index au début car il ne va pas trop varier. Les index n'aident pas si les données de la colonne ne varient pas trop.

Jetez un coup d'œil au SQL - quelles sont les clauses where? 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.

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

et parfois les analyses de table complètes sont plus rapides qu'un index. les petites tables peuvent être analysées plus rapidement que d'obtenir l'index, puis de frapper la table. Regardez vos jointures.

0
jim