2015-05-07 11 views
8

Mam problem z procedurami przechowywanymi i Entity Framework.Encja Framework Issue Podczas wykonywania procedur przechowywanych

Pozwól mi wyjaśnić, co się dzieje ... i co próbowałem do tej pory.

Mam procedurę przechowywaną, która nie robi strasznie dużo

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' 

chcę wykonać to i to działa dobrze w SSMS i nawet nie podejmują 1 sekundę.

Teraz mogę importować to do Entity Framework, to czas na zewnątrz i ustawić limit czasu polecenia do 120 ...

Ok, więc co próbowałem do tej pory i co mam przetestowane.

Jeśli użyję sposobu SqlCommand, SqlDataAdapter, DataTable, z własnym ciągiem połączenia, zostanie on wykonany zgodnie z oczekiwaniami. Kiedy używam ciąg połączenia Entity Framework w tym scenariuszu, limit czasu.

Zmieniono moją przechowywaną procedurę tak, aby zawierała opcję "Przekompiluj", a także wypróbowałem metodę SET ARITHABORT, bez powodzenia, która wygaśnie po uruchomieniu EF.

Czy to błąd w EF?

Właśnie postanowiłem przepisać to, używając dostępu do "starej szkoły".

Należy również pamiętać, że EF wykonuje dobrze na innych przechowywanych procach, z tej samej bazy danych.

Wszelkie pomysły i pomoc będą mile widziane ...

PS. Znalazłem ten artykuł, ale nie pomogło :(

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

+0

Czy możesz wypróbować znacznie prostsze zapytanie bez żadnego miejsca, np. Wybierz TOP 1 i sprawdź, czy otrzymujesz wynik –

+0

Czy możesz wpisać kod, którego używasz do wykonania tego zapytania? Ponadto spróbuj użyć profilera serwera SQL, aby zobaczyć, co dzieje się pod maską. Być może podajesz błędną wartość parametrów w przypadku EF? –

+0

Cóż, uruchomiłem profiler, a EF zabija serwer DB. ** CPU 3**, ** czyta 1364453 ** co do cholery, a to zostało zmienione, aby nie używać klauzuli where z parametrami, i tylko wybrać top 10 – Kobie

Odpowiedz

1

Może to być spowodowane przez Parameter Sniffing

Gdy procedura składowana jest kompilowany lub rekompilacji, wartości parametr przekazany do tej inwokacji są „nosem” i wykorzystane do oszacowania liczności. efekt netto jest to, że plan jest zoptymalizowane tak, jakby te konkretne wartości parametrów zostały wykorzystane jako literały w zapytaniu.

  1. z nami ing zmiennych binarnych, które nie są wyświetlane bezpośrednio na parametry również zapewnić stabilność realizacji planu bez konieczności rekompilacji dodać wskazówkę, poniższy przykład:

stworzyć procedurę dbo.SearchProducts @Keyword varchar (100) Stwierdzenie @Keyworddummy jako varchar (100) Zestaw @Keyworddummy = @Keyword select * from Produkty gdzie słowo jak @Keyworddummy

  1. Aby temu zapobiec i inne podobne sytuacje, można użyć następującej opcji zapytania:

optymalizacji dla rekompilacji

  1. Wyłącz auto-update statistics podczas partii
+3

Myślę, że może to być parametr Sniffing lub nieaktualne statystyki. – ewahner

Powiązane problemy