我正在开发一个使用 Entity Framework 的 MVC 网站。我以前是 ADO.Net 表单管理员,所以这对我来说有点陌生。我的 EDM 目前由一个抽象的“产品”实体组成,它有 5 个不同的“类型”实体继承自它。 “产品”实体映射到 7 或 8 个表并具有大约 50 个属性,从“产品”继承的每个“类型”都有大约 5 到 20 个扩展“产品”的额外属性。我注意到,当我在 IQueryable 上使用 .Take 扩展方法将数据返回到 Telerik 网格时,返回数据所花的时间明显比我使用 .ToList 贪婪地将整个集合返回到内存所花的时间要长。
当我运行 SQL Profiler 以查看到底发生了什么时,这就是我的发现。
exec sp_executesql N'SELECT TOP (20)
[Project12].[C1] AS [C1],
[Project12].[C2] AS [C2],
[Project12].[C3] AS [C3],
etc ... 508 SQL lines follow, too much to paste here unfortunately.
执行需要 500 毫秒。然而,以下内容:
exec sp_executesql N'SELECT
[Project12].[C1] AS [C1],
[Project12].[C2] AS [C2],
[Project12].[C3] AS [C3],
etc ...
执行大约需要 80 毫秒。
因此,根据上述逻辑判断,我应该放弃延迟执行,每次用户更改页面时...将整个数据集存入内存(500 行左右)。有没有人对正在发生的事情以及为什么 SQL Server 2005 以这种方式运行有任何建议?
编辑
我已将完整的 SQL 放在 http://pastebin.com/rAGGSScA 上.会不会是 SQL 正在缓存“完整”选择,而不是缓存“TOP (20)”结果?
SELECT 的客户端统计信息
SELECT TOP (20) 的客户统计
最佳答案
在您的“508 SQL 行 [that] followed”中的某处将是一个 ORDER BY 子句。通过对查询强制执行“TOP (N)”评估,您将强制服务器更早地评估此 order by 子句并在 之前计算所有 结果(包括它们的顺序)任何都可以显示。您可能最终会得到一个完全不同的执行计划,甚至可能会使索引无效(或与不太理想的索引匹配)。如果没有“TOP (n)”子句,服务器可以在知道将使用记录后立即开始显示结果。
关于sql - Entity Framework 生成的 SQL - SELECT TOP (X) 比 SELECT 多花费 500% 的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9011368/