例如,我有一个查询:
var personList = context.People;
People 是一个视图,上面有 2 个连接和大约 2500 行,执行大约需要 10 秒。查看估计的执行计划告诉我它正在使用嵌套循环。
现在如果我这样做:
var personList = context.People.Where(r => r.Surname.Length > -1);
执行时间不到一秒,执行计划使用 Hash Join。
在生成的 SQL 中添加“OPTION (HASH JOIN)”具有提高性能的预期效果。
所以我的问题是...
如何让查询使用哈希联接?它无法添加到视图中(我试过了,它出错了)。EF4 中是否有强制执行此操作的选项?还是我必须把它放在存储过程中?
审查
SELECT dbo.DecisionResults.ID, dbo.DecisionResults.UserID, dbo.DecisionResults.HasAgreed, dbo.DecisionResults.Comment,
dbo.DecisionResults.DateResponded, Person_1.Forename, Person_1.Surname, Site_1.Name, ISNULL(dbo.DecisionResults.StaffID, - 999)
AS StaffID
FROM dbo.DecisionResults INNER JOIN
Server2.DB2.dbo.Person AS Person_1 ON Person_1.StaffID = dbo.DecisionResults.StaffID INNER JOIN
Server2.DB2.dbo.Site AS Site_1 ON Person_1.SiteID = Site_1.SiteID
ORDER BY Person_1.Surname
如果我将 OPTION(HASH JOIN) 添加到末尾,则会出错:
在此查询类型中不能使用“查询提示”。
但是将该脚本作为查询运行可以正常工作。