J'exécute Microsoft SQL Server 2016 SP2-CU6 (13.0.5292.0) sur une machine virtuelle 4 vCPU avec max degree of parallelism
défini sur 2
et cost threshold for parallelism
défini sur 50
.
Le matin, lorsque j'essaie d'afficher un plan d'exécution estimé pour une requête SELECT TOP 100 , je suis confronté à des attentes massives et l'opération de rendu du plan estimé prend des minutes, souvent dans la plage de 5 à 7 minutes. Encore une fois, ce n'est pas l'exécution réelle de la requête, c'est juste le processus pour afficher un plan d'exécution estimé .
sp_WhoIsActive
affichera les PAGEIOLATCH_SH
attentes ou les LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
attentes et lorsque j'exécute le script WaitingTasks.sql de Paul Randal pendant l'opération, il affiche les CXPACKET
attentes avec les threads de travail indiquant les PAGEIOLATCH_SH
attentes:
* champ de description de ressource = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
Les threads de travail semblent ramener la stats
table entière en mémoire (comme ces numéros de page ainsi que les numéros de page suivants affichés à partir de la requête de Paul Randal pointent vers la clé en cluster pour la stats
table). Une fois que le plan est revenu, il est essentiellement instantané pour le reste de la journée, même après que je vois la plupart de l' stats
attrition de la table du cache avec seulement divers enregistrements restants (qui, je suppose, ont été retirés en raison de la recherche d'opérations à partir de requêtes similaires).
Je m'attendrais à ce comportement initial si la requête s'exécutait réellement avec un plan qui utilisait des opérateurs SCAN, mais pourquoi fait-il cela lors de l'évaluation des plans d'exécution uniquement pour arriver à un opérateur SEEK comme indiqué dans le plan lié ci-dessus? Que puis-je faire (en plus d'exécuter cette instruction avant les heures de bureau pour que mes données soient correctement mises en cache) pour améliorer les performances ici? Je suppose qu'une paire d'indices de couverture serait bénéfique, mais garantirait-elle vraiment tout changement de comportement? Je dois travailler dans certaines limites de la fenêtre de stockage et de maintenance ici, et la requête elle-même est générée à partir d'une solution fournisseur, donc toute autre suggestion (en plus d'une meilleure indexation) serait la bienvenue à ce stade.