Domanda

La profilazione delle query LINQ e dei loro piani di esecuzione è particolarmente importante a causa del folle SQL che a volte può essere creato.

Trovo spesso che devo tenere traccia di una query specifica e non riesco a trovare nell'analizzatore di query. Lo faccio spesso su un database che ha molte transazioni in esecuzione (a volte server di produzione) - quindi solo aprire Profiler non va bene.

Ho anche trovato cercando di usare DataContext per tracciare inadeguato, dal momento che non mi dà SQL che posso effettivamente eseguire da solo.

La mia migliore strategia finora è quella di aggiungere un numero "casuale" alla mia query e filtrarlo nella traccia.

LINQ:

where o.CompletedOrderID != "59872547981"

Filtro profiler:

'TextData' like '%59872547981'

Funziona bene con un paio di avvertimenti:

  • Devo stare attento a ricordare di rimuovere i criteri o scegliere qualcosa che non influisca troppo sul piano di query. Sì, so che lasciarlo significa chiedere problemi.
  • Per quanto posso dire, anche con questo approccio ho bisogno di iniziare una nuova traccia per ogni query LINQ che devo tracciare. Se vado in "File > Proprietà "per una traccia esistente Non posso modificare i criteri di filtro.

Non puoi battere l'esecuzione di una query nella tua app e vederla apparire nel Profiler senza alcuno sforzo aggiuntivo. Speravo solo che qualcun altro avesse escogitato un modo migliore di questo, o almeno suggerito un token meno "pericoloso" da cercare rispetto a una query su una colonna.

È stato utile?

Soluzione

Fare casini con la clausola where non è forse la cosa migliore da fare poiché può e influirà sui piani di esecuzione delle tue query.

Fai qualcosa di strano con la proiezione in classi anonime: usa un nome di colonna statico univoco o qualcosa che non influirà sul piano di esecuzione. (In questo modo è possibile lasciarlo intatto nel codice di produzione nel caso in cui sia necessario eseguire successivamente la profilazione del codice di produzione ...)

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

Altri suggerimenti

È possibile utilizzare il Visualizzatore debug Linq to SQL - http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx e vederlo nella finestra dell'orologio.

Oppure puoi usare DataContext.GetCommand (); per vedere l'SQL prima che venga eseguito.

Puoi anche guardare DataContext.GetChangeSet () per vedere cosa verrà inserito / aggiornato o eliminato.

Puoi fare in modo che il tuo datacontext disconnetta l'SQL grezzo, che puoi quindi cercare nel profiler per esaminare le prestazioni.

using System.Diagnostics.Debugger;

yourDataContext.Log = new DebuggerWriter();

Tutte le tue query SQL verranno ora visualizzate nella finestra di output del debugger.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top