Jak zoptymalizować kwerendy Entity Framework

Używam Linq-To-Entities do wykonania zapytania, które zwraca tylko 947 wierszy, ale trwa 18 sekund. Zrobiłem „ToTraceString”, aby uzyskać podstawowy sql i uruchomiłem to samo bezpośrednio w bazie danych i otrzymałem ten sam czas.

Użyłem doradcy ds. Tuningu i stworzyłem kilka indeksów, choć bez większego wpływu.

Patrząc na plan wykonania zapytania, istnieje kilka zagnieżdżonych pętli, które zajmują 95% czasu, ale już działają na indeksach?

Czy ktoś ma jakieś pomysły, jak wymusić optymalizację w zapytaniu EF?

EDYCJA: Dostarczanie dodatkowych informacji

Podstawowy diagram ER dla trzech tabel jest następujący:

People >----People_Event_Link ----< Events
P_ID        P_ID                    E_ID
            E_ID

Linq, który używam, ma na celu odzyskanie wszystkich zdarzeń dla konkretnej osoby (przy użyciu identyfikatora P_ID):

        var query = from ev in genesisContext.Events
                    join pe in genesisContext.People_Event_Link
                    on ev equals pe.Event
                    where pe.P_ID == key
                    select ev;
        return query;

Oto wygenerowany SQL (głęboki oddech!):

SELECT 
1 AS [C1], 
[Extent1].[E_ID] AS [E_ID], 
[Extent1].[E_START_DATE] AS [E_START_DATE], 
[Extent1].[E_END_DATE] AS [E_END_DATE], 
[Extent1].[E_COMMENTS] AS [E_COMMENTS], 
[Extent1].[E_DATE_ADDED] AS [E_DATE_ADDED], 
[Extent1].[E_RECORDED_BY] AS [E_RECORDED_BY], 
[Extent1].[E_DATE_UPDATED] AS [E_DATE_UPDATED], 
[Extent1].[E_UPDATED_BY] AS [E_UPDATED_BY], 
[Extent1].[ET_ID] AS [ET_ID], 
[Extent1].[L_ID] AS [L_ID]
FROM  [dbo].[Events] AS [Extent1]
INNER JOIN [dbo].[People_Event_Link] AS [Extent2] ON  EXISTS (SELECT 
    1 AS [C1]
    FROM    ( SELECT 1 AS X ) AS [SingleRowTable1]
    LEFT OUTER JOIN  (SELECT 
        [Extent3].[E_ID] AS [E_ID]
        FROM [dbo].[Events] AS [Extent3]
        WHERE [Extent2].[E_ID] = [Extent3].[E_ID] ) AS [Project1] ON 1 = 1
    LEFT OUTER JOIN  (SELECT 
        [Extent4].[E_ID] AS [E_ID]
        FROM [dbo].[Events] AS [Extent4]
        WHERE [Extent2].[E_ID] = [Extent4].[E_ID] ) AS [Project2] ON 1 = 1
    WHERE ([Extent1].[E_ID] = [Project1].[E_ID]) OR (([Extent1].[E_ID] IS NULL) AND ([Project2].[E_ID] IS NULL))
)
WHERE [Extent2].[P_ID] = 291

questionAnswers(3)

yourAnswerToTheQuestion