Est-il mauvais d'avoir un espace d'index plus grand que l'espace de données?

22

Souvent, j'ai besoin d'exécuter des requêtes sur de grandes tables qui n'ont pas le bon index. Je demande donc au DBA de créer un tel index. La première chose qu'il fait est de regarder les statistiques de la table et de voir la taille de l'espace d'index.

Souvent, il me disait de trouver une solution alternative car "l'indice est déjà plus grand que le tableau". Il pense que l'index doit être plus petit que les données, parce qu'il m'a dit "avez-vous déjà vu l'index dans un livre? Il est beaucoup plus petit que le livre lui-même, et c'est ainsi qu'un index de table devrait être".

Je ne pense pas que sa philosophie soit correcte, mais je ne peux pas le contester car il est un DBA principal et je suis développeur. Je pense que si une requête a besoin d'un index, l'index doit simplement être créé, au lieu de trouver des "solutions de contournement" qui rendent les SP illisibles et non maintenables.

Je sélectionne uniquement les colonnes requises. Le problème est que je filtre par date, le moteur effectuera donc nécessairement une analyse de table pour correspondre aux colonnes. La requête s'exécute une fois par jour, la nuit, pour recueillir des statistiques, mais son exécution prend 15 minutes (nous avons une autre règle stricte et rapide: aucune procédure ne devrait prendre plus de 3 minutes).

Le DBA m'a montré les statistiques de l'indice. Il y avait environ 10 index sur cette table, dont seulement 6 ont été utilisés (les statistiques ont montré zéro hit pour 4 d'entre eux). Il s'agit d'un grand système auquel participent plus de 20 développeurs. Les index ont été créés pour une raison quelconque et ne sont probablement plus utilisés.

Nous devons prendre en charge SQL Server 2008, car c'est sur cela que les bases de données de test s'exécutent. Mais les clients sont tous sur 2014 et 2016.

hjf
la source

Réponses:

34

Pensez à la conception d'index comme un interrupteur coulissant. Vous pouvez déplacer ce bouton de commutation triangle rouge n'importe où le long de la ligne souhaitée:

Décisions de conception d'index

Je ne le mesure généralement pas en termes de taille - je le pense généralement en termes de quantité d'indice, mais la taille conviendrait également.

Il semble que votre DBA pense que le commutateur est trop à droite - que vous avez ajouté trop d'index et que les suppressions / mises à jour / insertions fonctionnent trop lentement.

Plutôt que de discuter de l'emplacement du commutateur, essayez de lui poser des questions sur les problèmes de performances que vous rencontrez en raison du nombre élevé d'index. Peut-être que vos utilisateurs se plaignent de la vitesse de suppression / mise à jour / insertion, ou qu'il voit des verrous attendre, ou qu'il a du mal à sauvegarder la base de données en raison de sa taille.

Mon point de départ est généralement 5 et 5: environ 5 index par table, avec environ 5 champs ou moins par index. Il n'y a rien de magique dans ce nombre - il vient simplement du fait que j'ai 5 doigts dans chaque main, il est donc facile de tenir mes mains et d'expliquer la règle.

Vous devrez peut-être avoir plusieurs index MOINS de 5 lorsque votre charge de travail est fortement biaisée vers les opérations de suppression / mise à jour / insertion, et que vous n'avez pas assez de puissance matérielle pour suivre.

Vous pouvez avoir de nombreux index MORE lorsque votre charge de travail est principalement en lecture seule ou lorsque vous investissez massivement dans du matériel (comme mettre en cache l'intégralité de la base de données en mémoire et disposer de tout le stockage SSD en dessous).

Brent Ozar
la source
4

De plus, le désir d'avoir plus que des index "The Ozar 5" sur une table indique probablement que vous avez beaucoup de différents types de requêtes lourdes en lecture sur la table.

Ce qui indique probablement que vous pourriez bénéficier d'un index columnstore en cluster ou non en cluster sur la table.

Au lieu d'avoir l'index optimtimal pour chacun des N chemins d'accès différents, un magasin de colonnes vous offre une analyse ultra-rapide et la possibilité d'ignorer les colonnes inutiles et les segments de ligne. Ainsi, vous pouvez avoir un petit nombre d'index BTree pour les transactions super-critiques et revenir au magasin de colonnes pour tout le reste.

Les index Columnstore sont conçus pour fonctionner dans des charges de travail lourdes OLTP avec SQL Server 2016+. Voir la documentation pour l' analyse opérationnelle en temps réel .

David Browne - Microsoft
la source
3

J'aime la réponse de Brents et j'ai voté pour. Je voudrais cependant ajouter une autre perspective. J'ai travaillé en tant qu'utilisateur, développeur et DBA et je pense que les opinions ne sont pas pertinentes. Je pense qu'il appartient à l'utilisateur (ou à la partie prenante) de décider comment une requête s'exécute et combien de temps il faut pour obtenir des résultats. Il appartient ensuite au développeur et au DBA de travailler ensemble pour y arriver.

Si le poste DBA de votre entreprise est «en charge» de ce sujet, il peut analyser votre requête et faire des suggestions sur une meilleure conception de la requête ou répondre aux performances.

Si la requête et / ou la structure des données ne peuvent pas être modifiées pour atteindre l'objectif, je pense que cela se résume à trois choix.

  1. Récupération lente des données
  2. Mise à jour lente des données
  3. Plus de ressources matérielles $$$$

Bien sûr, chaque situation a de nombreuses variables en fonction de multiples facteurs commerciaux et technologiques, mais je pense que les trois options s'appliquent à la plupart, sinon à tous les cas.

Joe
la source
0

Semble trop strict pour interdire les index> table. Si votre table change rarement (ou change la nuit quand il n'y a pas beaucoup de concurrence pour les ressources) et qu'elle est souvent sollicitée de nombreuses manières différentes, de nombreux gros indices peuvent être justifiés. Les administrateurs de base de données doivent également veiller à ne pas coller leur nez là où il n'appartient pas. S'il vous donne / votre système une limite sur les gigaoctets, il ne devrait pas trop se soucier de la façon dont cet espace est utilisé. S'il est surmené, c'est peut-être pourquoi.

Cependant, il y a beaucoup de choses à considérer:

  • De nombreux index ralentissent les insertions / mises à jour / suppressions. Donc, si votre table change beaucoup, veillez à ne pas en faire trop.
  • L'espace peut aussi être un problème. Non seulement parce que les gigaoctets coûtent de l'argent (pas beaucoup de nos jours), mais aussi du temps car la sauvegarde sera plus lente (selon la façon dont la sauvegarde est effectuée).
  • La plupart des bases de données sérieuses peuvent être surveillées pour trouver des index rarement ou jamais utilisés. Pensez à en supprimer certains.
  • Parfois, vous pensez avoir besoin d'un index, mais lorsque vous examinez votre requête de plus près, elle peut être réglée et réécrite différemment avec le même résultat et sans avoir besoin de l'index. Utilisez le plan d'explication pour voir si l'index est utilisé ou non.
  • Parfois, la ou les dernières colonnes peuvent être supprimées d'un index multi-colonnes sans trop de performances. Et parfois, cela peut même rendre les requêtes plus rapides car l'espace de stockage d'index est plus petit et une plus grande partie de l'index sera conservée / mise en cache en mémoire à tout moment.
  • Les index basés sur les fonctions peuvent remplacer les index normaux pour économiser plus d'espace. Exemple: au lieu de rechercher le nom complet, recherchez également les deux premières lettres ( where substr(surname, 1, 2) = substr(<userinput>, 1, 2) and surname=<userinput>) et create index i on customers(substr(surname,1,2)). Cela pourrait être assez rapide et votre index sera plus petit.
  • Les bases de données prennent en charge différents types d'index. Certains types utilisent moins d'espace que d'autres. Peut-être que certains de vos index peuvent être convertis en un type moins gourmand en espace? Assurez-vous d'abord de comprendre les différents types d'index et les situations dans lesquelles ils sont bons et mauvais.
  • Si un travail par lots peu fréquent est la seule chose qui nécessite un index spécifique, envisagez de créer cet index uniquement pour ce travail par lots et supprimez-le ensuite.
Kjetil S.
la source