2015-05-07 19 views
8

Ich habe ein Problem mit gespeicherten Prozeduren und Entity Framework.Entity Framework Problem beim Ausführen gespeicherter Prozeduren

Lassen Sie mich erklären, was passiert ... und was ich bisher versucht habe.

Ich habe eine gespeicherte Prozedur, die nicht sehr viel

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' 

ich dies ausführen möchten nicht tun, und es funktioniert in SSMS in Ordnung und nicht einmal 1 Sekunde.

Nun, ich importieren diese in zu Entity Framework, es mal aus und ich den Befehl Timeout auf 120 ...

Ok, so was habe ich bisher versucht, und was ich getestet habe.

Wenn ich SqlCommand, SqlDataAdapter, DataTable Weise, mit meiner eigenen Verbindungszeichenfolge, wird es wie erwartet ausgeführt. Wenn ich in diesem Szenario die Verbindungszeichenfolge von Entity Framework verwende, wird das Zeitlimit überschritten.

Ich änderte meine gespeicherte Prozedur um "Recompile" -Option und versuchte auch die SET ARITHABORT Art und Weise, kein Glück, es Timeout, wenn Sie durch die EF laufen.

Ist das ein Fehler in EF?

Ich habe jetzt gerade beschlossen, dies neu zu schreiben mit "Old School" Datenzugriff.

Beachten Sie auch, dass die EF mit anderen gespeicherten Procs aus derselben Datenbank einwandfrei ausgeführt wird.

Irgendwelche Ideen oder Hilfe sehr dankbar ...

PS würde. Ich diesen Artikel gefunden, aber keine Hilfe entweder :(

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

+0

Können Sie viel einfachere Abfrage ohne irgendwelche wo cluase, wie wählen Sie TOP 1, und sehen, ob Sie Ergebnis erhalten –

+0

Könnten Sie den Code, den Sie verwenden, um diese Abfrage ausführen? Versuchen Sie auch, sql Server Profiler zu verwenden, um zu sehen, was unter der Haube geschieht. Vielleicht übergeben Sie den falschen Wert für die Parameter im EF-Fall? –

+0

Nun, ich habe den Profiler ausgeführt, und EF tötet den DB-Server. ** CPU 3**, ** liest 1364453 ** was zum Teufel, und das wurde geändert, um keine where-Klausel mit Parametern zu verwenden, und nur Top 10 auswählen – Kobie

Antwort

1

Dies kann durch Parameter Sniffing

Wenn eine gespeicherte Prozedur kompiliert oder neu kompiliert wird, verursacht werden, die Parameterwerte für diesen Aufruf übergeben werden „schnupperte“ und für Kardinalität-Schätzung verwendet. der Nettoeffekt ist, dass der Plan optimiert ist, als ob diese spezifischen Parameterwerte als Literale in der Abfrage verwendet wurden.

  1. sie Dummy-Variablen ing, der Ausführungsplan Stabilität ohne die Notwendigkeit sicherzustellen, auf Parameter angezeigt werden auch nicht direkt Hinweis hinzufügen neu kompilieren, zB unter:

Verfahren dbo erstellen.SearchProducts @Keyword varchar (100) Wie @Keyworddummy als varchar deklarieren (100) Set @Keyworddummy = @Keyword select * from Produkte wo Keyword wie @Keyworddummy

  1. Um dies zu verhindern und andere ähnliche Situationen können Sie die folgende Abfrage-Option verwenden:

OPTIMIZE FOR RECOMPILE

  • Deaktivieren Sie die automatische Update-Statistiken während der Partie
  • +3

    Ich denke, es könnte Parameter Sniffing oder veraltete Statistiken sein. – ewahner

    Verwandte Themen