«Avertissements: l'opération a provoqué des E / S résiduelles» par rapport aux recherches clés


9

J'ai vu cet avertissement dans les plans d'exécution de SQL Server 2017:

Avertissements: L'opération a causé des E / S résiduelles [sic]. Le nombre réel de lignes lues était de (3 321 318), mais le nombre de lignes renvoyées était de 40.

Voici un extrait de SQLSentry PlanExplorer:

Entrez la description de l'image ici

Afin d'améliorer le code, j'ai ajouté un index non clusterisé, afin que SQL Server puisse accéder aux lignes pertinentes. Cela fonctionne bien, mais normalement il y aurait trop de (grandes) colonnes à inclure dans l'index. Cela ressemble à ceci:

Entrez la description de l'image ici

Si j'ajoute uniquement l'index, sans inclure les colonnes, cela ressemble à ceci, si je force l'utilisation de l'index:

Entrez la description de l'image ici

De toute évidence, SQL Server pense que la recherche de clé est beaucoup plus coûteuse que les E / S résiduelles. J'ai une configuration de test sans encore beaucoup de données de test, mais lorsque le code entre en production, il doit fonctionner avec beaucoup plus de données, donc je suis assez sûr qu'une sorte d'index NonClustered est nécessaire.

Les recherches de clés sont-elles vraiment si chères , lorsque vous exécutez sur des SSD, que je dois créer des index complets (avec beaucoup de colonnes d'inclusion)?


Plan d'exécution: https://www.brentozar.com/pastetheplan/?id=SJtiRte2X Il fait partie d'une longue procédure stockée. Cherchez IX_BatchNo_DeviceNo_CreatedUTC.


Question pour vous - Sur la base de votre dernier paragraphe, pourquoi le coût d'une recherche serait-il moins basé sur le matériel? (On suppose que le même matériel que l'index non clusterisé s'exécutera) Je ne suis pas clair à ce sujet.
George.Palacios

4
Il est estimé à 76,9% du coût de ce plan . Cela ne signifie pas que c'est cher. Regardez le coût d'E / S de 0,06 par rapport à votre plan d'origine avec un coût d'E / S supérieur à 10. Je pense que vous ferez mieux, mais vous devriez tester avec des plans réels par rapport à suffisamment de données qui simulent vraiment à quoi ressemblera la production ( et si la requête s'exécute suffisamment longtemps pour que nous puissions collecter des données sys.dm_exec_query_profiles, nous les revaloriserons à partir des coûts réels par rapport aux estimations). Arrêtez d'utiliser le pourcentage de coût estimé comme un indicateur absolu du coût - il est relatif et il est souvent à l'heure du déjeuner.
Aaron Bertrand

@AaronBertrand; le coût estimé des recherches clés est de 31,0. Êtes-vous en train de me dire que SQL Server ne connaît pas le coût des E / S résiduelles?
Henrik Staun Poulsen

Où voyez-vous 31.0? Et vous voulez dire 31,0 ou 31,0%?
Aaron Bertrand

1
Non, je dis que les coûts que vous voyez sont des coûts estimés et, comme Paul l'explique ci-dessous, ne reflètent pas nécessairement les performances d'exécution.
Aaron Bertrand

Réponses:


16

Le modèle de coût utilisé par l'optimiseur est exactement cela: un modèle . Il produit généralement de bons résultats sur une large gamme de charges de travail, sur une large gamme de conceptions de bases de données, sur une large gamme de matériel.

Vous ne devez généralement pas supposer que les estimations de coûts individuelles seront fortement corrélées avec les performances d'exécution sur une configuration matérielle particulière. Le coût est de permettre à l'optimiseur de faire un choix éclairé entre des alternatives physiques candidates pour la même opération logique.

Lorsque vous entrez vraiment dans les détails, un professionnel de base de données qualifié (avec le temps nécessaire pour régler une requête importante) peut souvent faire mieux. Dans cette mesure, vous pouvez considérer la sélection de plan de l'optimiseur comme un bon point de départ. Dans la plupart des cas, ce point de départ sera également le point d'arrivée, car la solution trouvée est suffisamment bonne .

D'après mon expérience (et mon opinion), l'optimiseur de requêtes SQL Server coûte des recherches plus élevées que je ne le préférerais. Il s'agit en grande partie d'une gueule de bois du temps où les E / S physiques aléatoires étaient beaucoup plus chères par rapport à l'accès séquentiel que ce n'est souvent le cas aujourd'hui.

Pourtant, les recherches peuvent être coûteuses même sur les SSD, ou même lors de la lecture exclusivement à partir de la mémoire. Traverser des structures b-tree n'est pas gratuit. De toute évidence, le coût augmente à mesure que vous en faites plus.

Les colonnes incluses sont idéales pour les charges de travail OLTP à lecture intensive, où le compromis entre l'utilisation de l'espace d'index et le coût de la mise à jour par rapport aux performances de lecture à l'exécution est logique. Il y a aussi un compromis à considérer autour de la stabilité du plan . Un indice couvrant complètement évite la question de savoir quand exactement le modèle de coût de l'optimiseur peut passer d'une alternative à l'autre.

Vous seul pouvez décider si les compromis en valent la peine dans votre cas. Testez les deux alternatives sur un échantillon de données représentatif et faites un choix éclairé.

Dans un commentaire de question, vous avez ajouté:

Êtes-vous en train de me dire que SQL Server ne connaît pas le coût des E / S résiduelles?

Non, l'optimiseur tient compte du coût des E / S résiduelles. En effet, en ce qui concerne l'optimiseur, les prédicats non SARGables sont évalués dans un filtre séparé. Ce filtre est inséré dans la recherche ou l'analyse en tant que résidu lors des réécritures post-optimisation .


Merci beaucoup pour votre réponse. J'essaierai de suivre vos conseils sur les données de test, afin de pouvoir déterminer de quel indice j'ai vraiment besoin. Il est bon de savoir que vous pensez que les recherches devraient coûter moins cher sur les SSD. Cela augure bien pour vNext.
Henrik Staun Poulsen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.