Une façon de déterminer la procédure stockée en cours d'exécution est d'utiliser des méthodes de "gestion dynamique", comme ceci:
SELECT
sqlText.Text, req.*
FROM
sys.dm_exec_requests req
OUTER APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Toutefois, cela affiche uniquement le texte de l'instruction create de la procédure stockée. par exemple:
CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Idéalement, j'aimerais voir quels étaient les paramètres de la procédure en cours qui la font fonctionner si longtemps pour l'ensemble particulier de paramètres incriminés.
Y-a-t-il un moyen de faire ça? (Dans cette question, Aaron Bertrand mentionne DBCC InputBuffer , mais je ne pense pas que ce soit approprié pour ce problème.)
sql-server
t-sql
sql-server-2005
stored-procedures
dmv
user420667
la source
la source
Réponses:
Ces informations - les valeurs des paramètres d'exécution passées dans une procédure stockée (c'est-à-dire un appel RPC) ou une requête paramétrée - sont uniquement disponibles via une trace SQL (et je suppose que l'événement étendu équivalent dans les versions plus récentes de SQL Server). Vous pouvez voir cela en exécutant SQL Server Profiler (il est livré avec SQL Server) et en sélectionnant les différents événements « Terminé », tels que:
RPC:Completed
,SP:Completed
, etSQL:BatchCompleted
. Vous devez également sélectionner le champ "TextData" car les valeurs y seront.La différence entre ma réponse et @ Kin réponse à cette question est que la réponse @ Kin ( à moins que je ne me trompe, dans ce cas , je vais supprimer cette) se concentre sur l' obtention soit:
Ma réponse se concentre sur l'obtention des valeurs des paramètres pour les autres sessions en cours d'exécution. Lorsque vous vous appuyez sur les DMV, il n'y a aucun moyen de savoir si la valeur du paramètre d'exécution est la même que la valeur du paramètre compilé. Et le contexte de cette question est de rechercher la valeur d'exécution des requêtes soumises via d'autres sessions / SPID (et dans SQL Server 2005, tandis que les événements étendus ont été introduits dans SQL Server 2008).
la source
Vous pouvez activer le plan d'exécution réel, puis consulter le XML du plan d'exécution.
Ou vous pouvez utiliser l'outil explorateur de plan de sql sentry et voir l'
parameters
onglet qui listera lecompiled value
etrun time value
le plan d'exécution réel.Si vous ne pouvez pas activer le plan réel, vous pouvez consulter le cache du plan comme décrit ci-dessous.
la source
Showplan XML Statistics Profile
événement dans Profiler pour obtenir le plan réel, mais si vous retirez Profiler, il y aurait des moyens moins intensifs d'obtenir cela.@SolomonRutzky a raison.
La trace SQL Profiler est le seul moyen ( sans modifier le Sproc ).
Modifiez votre Sproc:
Cependant , la meilleure chose à faire est de modifier légèrement le Sproc en question.
Déclarez une variable DateTime au début avec l'heure actuelle.
À la fin du Sproc, enregistrez les valeurs Sproc_StartTime, Sproc_EndTime et Parameter dans une table.
Vous pouvez même ajouter une logique conditionnelle pour utiliser un DateDiff () pour la journalisation uniquement lorsqu'une période de temps étendue a été utilisée dans le traitement du Sproc.
Cela peut accélérer votre Sproc et réduire la consommation d'espace de votre table de journal lorsque le Sproc est en cours d'exécution.
Ensuite, vous avez un fichier journal que vous pouvez interroger et analyser au cours des mois (sans trace en cours d'exécution dans Prod).
Lorsque vous avez terminé de régler votre Sproc, supprimez simplement les quelques lignes de logique Timer et Logger que vous avez ajoutées.
Valeurs des paramètres du plan mis en cache:
Je dois mentionner que l'inclusion des valeurs actuelles des paramètres du plan mis en cache dans votre table de journal peut vous aider à déterminer si elles aggravent le problème de performances .
J'utilise
OPTIMIZE FOR
pour définir la façon de gérer les paramètres dans mon Sproc quand je sais qu'il sera utilisé pour le découpage et le découpage des données.Je trouve que l'utilisation
OPTIMIZE FOR
donne des résultats cohérents et rapides lorsque vous utilisez le même Sproc avec des paramètres que des filtres optionnels .C'est certainement une variable de moins à considérer si vous spécifiez comment les gérer.
Vous trouverez ci-dessous un exemple de ce que vous pourriez ajouter au bas de votre instruction Select:
la source
J'ai remarqué lors de l'utilisation de la requête d'Erland Sommarskog pour déchiqueter le plan XML et extraire ParameterCompiledValue que le premier CTE "basedata" ne tient pas compte des plans qui ont des AVERTISSEMENTS (par exemple des conversions implicites) car CHARINDEX (fonction intégrée) recherche la première chaîne de correspondance d'expression. (c.-à-d.) et ces avertissements utilisent ces mêmes phrases / nœuds.
Je propose donc de remplacer cette section par la section révisée ci-dessous:
Section révisée:
la source
Disallowed implicit conversion from data type xml to data type varchar, table 'sys.dm_exec_query_plan', column 'query_plan'. Use the CONVERT function to run this query.
la source