2011-02-10 24 views
20

Come si utilizza l'Ottimizzatore di SQL Server per produrre consigli basati sulle query di Entity Framework? Entity Framework utilizza sp_executesql 'query' invece di eseguire la query e Ottimizzazione guidata non riconosce queste query. Potrei ottenere manualmente il testo della query, ma funzionerà solo per uno scenario molto semplice. Come lo faccio in modo automatico?Entity Framework e SQL Server Tuning Advisor

UPDATE

Sarebbe utile se risparmio l'informazioni profiling in una tabella e quindi eseguire alcune applicazioni, che metterà a nudo "sp_executesql" e mantenere solo il testo della query e utilizzare questi nuovi dati per eseguire Ottimizzazione guidata?

+0

Mi piace questa domanda. Dovrebbe essere richiesto anche su MS Connect, perché l'attuale generatore SQL non è molto buono e questo è solo uno dei tanti problemi. –

+1

Ho ancora problemi con questo. Ho provato tutti i suggerimenti di seguito. Difficile trovare qualche buona informazione sull'argomento anche .. – eatfrog

risposta

0

Utilizzare SQL Profiler per acquisire un'intera sessione di query. Al termine, è possibile salvare i risultati del profiler ed eseguire l'intera operazione tramite Ottimizzazione guidata di SQL Server. Nella mia esperienza, questo offre risultati molto migliori rispetto all'ottimizzazione basata su singole query e in molti modi è più semplice e realistico poiché è possibile utilizzare profiler per acquisire query dall'utilizzo reale dell'applicazione.

EDIT:

Grazie per portare maggiore attenzione al problema specifico che stai chiedendo circa. Non avevo capito che stavi dicendo che il Tuning Advisor non capisce sp_executesql perché semplicemente non è vero. È possibile eseguire tutte le query desiderate tramite sp_executesql e acquisirle in un profilo, quindi eseguire quel profilo tramite Tuning Advisor e fornirà suggerimenti.

Per essere sicuro, l'ho appena fatto con MS SQL Server 2008 R2. Ho creato una tabella senza indici, ho eseguito una serie di query tramite sp_executesql, le ho acquisite in SQL Profiler e poi ho eseguito la traccia risultante tramite Tuning Advisor. Tuning Advisor ha fornito consigli appropriati per le query incorporate all'interno di sp_executesql.

La versione esatta di Ottimizzazione guidata motore di database è 10.50.1600.1, in esecuzione su Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) 22 aprile 2011 19:23:43 Copyright (c) Edizione Microsoft Corporation Developer (64 bit) in Windows NT 6.1 (Build 7601: Service Pack 1).

+0

Non penso che tu capisca la domanda. Il problema è che EF emette i comandi sp_executesql, che l'advisor tuning non comprende. – Craig

+0

@Craig, hai ragione, non ho capito, ma è perché la premessa non è vera. La domanda è chiedere cosa fare in quanto Tuning Advisor non comprende 'sp_executesql', ma Tuning Advisor in realtà capisce bene sp_executesql utilizzando la procedura descritta sopra. –

+0

Penso che se stai analizzando l'output di SQL Server Profiler, registra le singole dichiarazioni e non solo i batch e penso che otterrai l'output giusto che devi dare consigli. –

5

Sembra che il problema sia questo. Se si crea una traccia utilizzando SQL Profiler dal modello "Tuning", non include gli eventi corretti. Ottimizzazione guidata motore di database non capisce le affermazioni sp_executsql dagli eventi completati in batch. Segnala nel log di ottimizzazione "Evento non fa riferimento a nessuna tabella" con un ID di categoria "S008".

Quando si acquisisce la traccia è necessario aggiungere anche l'evento "SQL: StmtCompleted" nella sezione TSQL.

+1

Non ho trovato questa soluzione per funzionare neanche. –

2

Jeff Walker mi ha segnalato nella giusta direzione - ma la sua risposta era incompleta (anche se sono certo che sapeva la risposta completa e semplicemente non completamente spiegarlo)

Nella Selezione eventi per SQL Server Profiler:

Rimuovere la registrazione di RPC: completato in stored procedure - questo è l'elemento che fa male con Entity Framework

espandere a tutti gli eventi e ADD SP: StmtCompleted sotto stored procedure, al fine di ottenere il domande int o la traccia.

Sembra funzionare per me.

Microsoft Entity Framework Persone (e persone profiler) Questo è in realtà zoppo. Funzionava.

6

So che questo argomento è un po 'freddo. Ma dal momento che stavo avendo lo stesso problema e trovato una soluzione migliore:

Cambiare gli eventi catturati è un modo per farlo, ma esiste già un "modello", che registra tutto ciò che è necessario all'advisor di ottimizzazione del server SQL.

Se si seleziona il modello "tuning", rimuoverà efficacemente e aggiungerà l'evento citato da Doug, ma anche un altro.

È possibile trovare maggiori informazioni su modello here

Per attivare questo modello, nelle finestre "nuova traccia", selezionare il modello corrispondente (Non ho creato, era già lì): New trace properties

Una volta fatto, è possibile controllare la selezione eventi, si è già ciò che è necessario: Trace event selection

ho additionaly disattivato il RPCCompleted, dal momento che non ho stored procedure

Spero che possa aiutare alcune persone;)

Problemi correlati