A propos du plan d exécution
Bonjour,
ce petit post comporte 2 demandes:
- où puis je trouver de la documentation pour exploiter au mieux l outil 'plan d exécution'?
- lorsque j utilise le script (de developpez.com) pour détecter les 10 transactions les plus coûteuses, j obtiens parfois des requêtes avec des paramètres. Ce qui bien sur entraine une erreur lors de la demande du plan. Comment peut on contourner ce problème.
merci de votre aide
Labienus
script détection des requêtes les plus coûteuses
bonjour Elsuket,
j ai utilisé la requête suivante pour détecter les requêtes les plus consommatrices:
Code:
1 2 3 4 5 6 7 8 9 10
| --======================================================================================
--> Afficher les 10 dernières requêtes les plus consommatrices de CPU
--======================================================================================
SELECT TOP 10 total_worker_time/execution_count AS [Avg CPU Time],
SUBSTRING(st.text, (qs.statement_start_offset/2)+1,((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time/execution_count DESC; |
Lorsque je soumets la requête au plan d exécution, tout se passe bien SAUF dans le cas de requête avec paramètre:
requête:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| FROM
sys.all_objects AS udf
LEFT OUTER JOIN sys.sql_modules AS smudf ON smudf.object_id = udf.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmudf ON ssmudf.object_id = udf.object_id
LEFT OUTER JOIN sys.all_parameters AS ret_param ON ret_param.object_id = udf.object_id and ret_param.is_output = @_msparam_0 <<<<<--- c est là où cela pose problème!
LEFT OUTER JOIN sys.types AS usrt ON usrt.user_type_id = ret_param.user_type_id
LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = ret_param.system_type_id and baset.user_type_id = baset.system_type_id) or ((baset.system_type_id = ret_param.system_type_id) and (baset.user_type_id = ret_param.user_type_id) and (baset.is_user_defined = 0) and (baset.is_assembly_type = 1))
LEFT OUTER JOIN sys.xml_schema_collections AS xscret_param ON xscret_param.xml_collection_id = ret_param.xml_collection_id
LEFT OUTER JOIN sys.schemas AS s2ret_param ON s2ret_param.schema_id = xscret_param.schema_id
LEFT OUTER JOIN sys.schemas AS s1ret_param ON s1ret_param.schema_id = usrt.schema_id
WHERE
(udf.type in ('TF', 'FN', 'IF', 'FS', 'FT')) |
sqlserver me retourne:
Code:
1 2
| Msg*137, Niveau*15, État*2, Ligne*55
La variable scalaire "@_msparam_0" doit être déclarée. |
comment puis contourner le problème?
merci de votre aide
Labienus