Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment choisir et optimiser les index 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

Mise à jour pour 19c :https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/designing-and-developing-for-performance.html#GUID-99A7FD1B-CEFD-4E91-9486- 2CBBFC2B7A1D

Citation :

  • 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, consultez 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 d'une table ayant la même valeur pour la clé indexée. La sélectivité d'un index est optimale si peu de 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 de colonnes à faible sélectivité peut être utile si la distribution des données est faussée de sorte qu'une ou deux 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. Ces clés ou expressions ont généralement une faible sélectivité et n'optimisent donc pas les performances à moins que les valeurs de clé fréquemment sélectionnées n'apparaissent moins fréquemment que les autres valeurs de clé. 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é.

  • N'indexez pas les colonnes qui sont modifiées fréquemment. 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 dans les index ainsi que les données dans les 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 la fonction.

  • Envisagez d'indexer les clés étrangères des 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 UPDATE et les DELETE 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, les UPDATE et les DELETE et l'utilisation de l'espace requis pour stocker l'index. Vous pouvez 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.