2015-05-07 16 views
8

Ho un problema con stored procedure e Entity Framework.Entity Framework Problema durante l'esecuzione di stored procedure

Lasciatemi spiegare cosa sta succedendo ... e cosa ho provato fino ad ora.

Ho una stored procedure, che non fa un sacco

SELECT 
    COUNT(DISTINCT(EmailAddress)) AcceptedQuotes, 
    CONVERT (DATE,QuoteDate) QuoteDate 
FROM 
    Quote Q 
JOIN 
    Person P on Q.PersonPk = P.Pk 
JOIN 
    Product Pr on Q.ProductPk = Pr.Pk 
JOIN 
    Accepted A on Q.Pk = A.QuotePk 
WHERE    
    QuoteDate between @startDate and @endDate 
    AND CompanyPk = @companyPk 
    AND FirstName != 'Test' 
    AND FirstName != 'test' 
    AND FirstName != 'EOH' 

voglio eseguire questo, e funziona bene in SSMS e non tiene nemmeno 1 secondo.

Ora, importare questo in Entity Framework, il tempo è scaduto e ho impostato il timeout di comando per 120 ...

Ok, quindi quello che ho provato finora e quello che ho provato.

Se utilizzo il modo SqlCommand, SqlDataAdapter, DataTable, con la mia stringa di connessione, viene eseguito come previsto. Quando utilizzo la stringa di connessione di Entity Framework in questo scenario, si verifica un timeout.

Ho modificato la mia procedura memorizzata per includere l'opzione "Ricompila" e ho anche provato il modo SET ARITHABORT, senza fortuna, si verifica un timeout durante l'esecuzione dell'EF.

Si tratta di un bug in EF?

Ora ho quasi deciso di riscriverlo utilizzando l'accesso ai dati "vecchia scuola".

Si noti inoltre che l'EF viene eseguito correttamente con altri proc memorizzati, dallo stesso database.

Tutte le idee o aiuto sarebbe molto apprezzato ...

PS. Ho trovato questo articolo, ma nessun aiuto né :(

http://www.sommarskog.se/query-plan-mysteries.html

+0

Puoi provare una query molto più semplice senza alcun dove, come selezionare TOP 1, e vedere se ottieni i risultati –

+0

Potresti pubblicare il codice che utilizzi per eseguire questa query? Inoltre, prova ad usare il profiler del server SQL per vedere cosa sta succedendo sotto il cofano. Forse stai passando il valore sbagliato per i parametri nel caso EF? –

+0

Bene, ho eseguito il profiler e EF sta uccidendo il server DB. ** CPU 3**, ** legge 1364453 ** che diavolo, e questo è stato modificato per non usare una clausola where con parametri, e selezionare solo top 10 – Kobie

risposta

1

Ciò può essere causato da Parameter Sniffing

Quando una stored procedure viene compilato o ricompilato, i valori dei parametri passati per quella invocazione sono "annusato" e utilizzato per la stima cardinalità. l'effetto netto è che il piano è ottimizzato come se i valori dei parametri specifici sono stati usati come letterali nella query.

  1. Us ing variabili dummy non visualizzate direttamente su parametri anche garantire l'esecuzione stabilità progetto senza necessità di aggiungere ricompilare suggerimento, l'esempio qui sotto:

create procedure dbo.Ricercaprodotti @Keyword varchar (100) Per quanto Dichiarare @Keyworddummy come varchar (100) Set @Keyworddummy = @Keyword select * from Prodotti in cui parole chiave come @Keyworddummy

  1. Per evitare questo e altre situazioni simili, è possibile utilizzare la seguente opzione query:

OPTIMIZE FOR RECOMPILE

  1. disattivare le statistiche di aggiornamento automatico durante il batch
+3

Penso che potrebbe essere Parameter Sniffing o statistiche obsolete. – ewahner

Problemi correlati