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.
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.
Il y a certaines choses que vous devez toujours indexer:
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.
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:
Utilisez les instructions suivantes pour déterminer quand créer un index:
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:
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:
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?
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
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.