【发布时间】:2009-08-05 13:23:42
【问题描述】:
我正在使用 Linq-To-Entities 进行查询,该查询仅返回 947 行,但运行时间为 18 秒。我已经做了一个“ToTraceString”来获取底层 sql 并直接在数据库上运行相同的东西并获得相同的时间。
我使用了调优顾问并创建了几个索引,但影响不大。
查看查询执行计划,有几个嵌套循环占用了 95% 的时间,但它们已经在处理索引?
有人对如何强制对 EF 查询进行一些优化有任何想法吗?
编辑:提供更多信息
三个表的基本 ER 图如下:
People >----People_Event_Link ----< Events
P_ID P_ID E_ID
E_ID
我正在运行的 linq 旨在获取特定人员的所有事件(使用 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;
这是生成的 SQL(深呼吸!):
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
【问题讨论】:
-
我刚刚敲了自己的 sql 来进行查询,它在不到一秒钟的时间内就运行了,哎呀.... SELECT * FROM Events AS E INNER JOIN People_Event_Link AS PE ON E.E_ID =PE.E_ID INNER JOIN PEOPLE AS P ON P.P_ID=PE.P_ID WHERE P.P_ID = 291
标签: mysql performance entity-framework