Je vois constamment des gens disent que les indices ralentissent update
, delete
et insert
. Ceci est utilisé comme une instruction générale, comme s'il s'agissait d'un absolu.
Tout en ajustant ma base de données pour améliorer les performances, je continue de rencontrer cette situation qui semble contredire logiquement cette règle pour moi, et nulle part je ne peux trouver quelqu'un dire ou expliquer de quelque manière que ce soit autrement.
Dans SQL Server, et je pense / présume la plupart des autres SGBD, vos index sont créés en fonction des colonnes spécifiques que vous spécifiez. Les insertions et les suppressions affecteront toujours une ligne entière, il n'y a donc aucun moyen qu'elles n'affectent pas l'index, mais les mises à jour semblent un peu plus uniques, elles peuvent spécifiquement affecter uniquement certaines colonnes.
Si j'ai des colonnes qui ne sont incluses dans aucun index et que je les mets à jour, sont-elles ralenties simplement parce que j'ai un index sur d'autres colonnes de cette table?
Par exemple, disons dans ma User
table que j'ai un ou deux index, la clé primaire qui est une colonne Identity / Auto Increment, et éventuellement une autre sur une colonne de clé étrangère.
Si je mets à jour une colonne sans l'index directement dessus, comme par exemple leur numéro de téléphone ou leur adresse, cette mise à jour est-elle ralentie parce que j'ai des index sur cette table sur d'autres colonnes dans les deux situations? Les colonnes que je mets à jour ne sont pas dans des index, donc logiquement, les index ne devraient pas être mis à jour, n'est-ce pas? Si quoi que ce soit, je pense qu'ils sont accélérés si j'utilise les index de la clause WHERE.
so there is no way they will not affect the index
sauf pour les index filtrés ...Réponses:
Vous avez raison: la mise à jour d'une colonne non indexée n'entraînera pas de modifications des index. Dans un cas simple, il n'y aurait pas non plus d'impact global sur la table.
Si une requête peut utiliser l'index pour rechercher des données, cela peut accélérer la recherche, mais le comportement exact (selon votre marque SQL) peut différer des autres marques SQL. (J'utilise principalement Microsoft SQL Server.)
Bien sûr, la mise à jour d'une colonne avec un volume de données significativement plus élevé peut entraîner un déplacement des lignes vers différentes pages, et cetera.
la source
Pour un système moderne relativement rapide, l'ajout d'un seul index à une table OLTP sera probablement pratiquement indétectable du point de vue des performances pour la grande majorité des systèmes . Cela dit, vous ne devez pas créer d'index inutiles et vous ne devriez probablement pas créer d'index à une seule colonne pour chaque colonne d'une table.
Vous avez raison de supposer que pour de nombreuses requêtes, la présence d'index utiles entraînera une amélioration très sensible de la vitesse.
Bien que votre question semble concerner les performances, il existe plusieurs autres problèmes potentiels liés à l'ajout d'index, notamment, mais sans s'y limiter:
Le temps requis pour créer l'index peut entraîner un blocage pendant que l'index est ajouté à la table. La serrure est de courte durée et ne créera probablement pas de gros problème.
Les modifications d'index entraînent l'annulation des plans d'exécution pour tous les plans faisant référence à la table sous-jacente. Lorsque ces plans d'exécution sont recompilés, les performances peuvent changer négativement pour certaines requêtes.
Les modifications d'index peuvent entraîner des requêtes renvoyant des erreurs là où aucune n'a été retournée précédemment. Prenons le cas d'un index filtré qui a été utilisé pour renvoyer des dates contenues dans un champ varchar; si le filtre a supprimé toutes les lignes qui n'étaient pas des dates et que ce filtre a été modifié par la suite, les requêtes qui s'appuyaient sur cet index peuvent désormais échouer lors de la tentative de conversion de données non datées.
Un nouvel index peut entraîner un changement de l'ordre d'exécution, entraînant des blocages possibles survenant là où ils ne s'étaient pas produits auparavant.
la source
Si l'opération de mise à jour cible une colonne non indexée de taille fixe (comme un entier), elle ne devrait pas être lente de manière générale, mais par rapport à une instruction select, la mise à jour doit éventuellement être également écrite sur le disque lent.
la source