Astuces astucieuses pour find des requêtes LINQ spécifiques dans SQL Profiler

Le profilage des requêtes LINQ et de leurs plans d'exécution est particulièrement important en raison du SQL fou qui peut parfois être créé.

Je trouve souvent que j'ai besoin de suivre une requête spécifique et avoir du mal à find dans l'parsingur de requête. Je le fais souvent sur une database qui a beaucoup de transactions en cours d'exécution (parfois le server de production) – donc l'ouverture de Profiler n'est pas bonne.

J'ai également trouvé tryin d'employer le DataContext pour tracer inadéquat, puisqu'il ne me donne pas SQL que je peux réellement exécuter moi-même.

Ma meilleure stratégie à ce jour est d'append un nombre 'random' à ma requête, et de le filterr dans la trace.

LINQ:

where o.CompletedOrderID != "59872547981" 

Filtre de profileur:

 'TextData' like '%59872547981' 

Cela fonctionne bien avec quelques mises en garde:

  • Je dois faire attention à ne pas oublier les critères, ou choisir quelque chose qui n'affectera pas trop le plan de la requête. Oui, je sais que le laisser request des ennuis.
  • Pour autant que je sache, même avec cette approche, je dois commencer une nouvelle trace pour chaque requête LINQ dont j'ai besoin de suivre. Si je vais dans 'Fichier> properties' pour une trace existante, je ne peux pas changer les critères de filter.

Vous ne pouvez pas exécuter une requête dans votre application et la voir s'afficher dans le profileur sans effort supplémentaire. J'espérais juste que quelqu'un d'autre ait trouvé un meilleur moyen que celui-ci, ou du less suggérer un jeton less "dangereux" à searchr qu'une requête sur une colonne.

Le fait de jouer avec la clause where n'est peut-être pas la meilleure chose à faire car cela peut affecter les plans d'exécution de vos requêtes.

Faites quelque chose de génial avec la projection dans des classs anonymes à la place – utilisez un nom de colonne statique unique ou quelque chose qui n'affectera pas le plan d'exécution. (De cette façon, vous pouvez le laisser intact dans le code de production au cas où vous auriez plus tard besoin de faire un profilage du code de production …)

 from someobject in dc.SomeTable where someobject.xyz = 123 select new { MyObject = someobject, QueryTraceID1234132412='boo' } 

Vous pouvez utiliser le visualiseur de debugging Linq to SQL – http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx et le voir dans votre window de surveillance.

Ou vous pouvez utiliser DataContext.GetCommand(); pour voir le SQL avant qu'il ne s'exécute.

Vous pouvez également consulter DataContext.GetChangeSet() pour voir ce qui va être inséré / mis à jour ou supprimé.

Vous pouvez faire en sorte que votre datacontext déconnecte le SQL brut, que vous pouvez ensuite searchr dans le profileur pour examiner les performances.

 using System.Diagnostics.Debugger; yourDataContext.Log = new DebuggerWriter(); 

Toutes vos requêtes SQL seront affichées dans la window de sortie du débogueur maintenant.