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
Czy możesz wypróbować znacznie prostsze zapytanie bez żadnego miejsca, np. Wybierz TOP 1 i sprawdź, czy otrzymujesz wynik –
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? –
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