sql - Entity Framework 生成的 SQL - SELECT TOP (X) 比 SELECT 多花费 500% 的时间

标签 sql sql-server entity-framework select telerik

我正在开发一个使用 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

SELECT TOP (20) 的客户统计

Select Top

最佳答案

在您的“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/

相关文章:

java - 如何从 java.sql.Connection 获取用户名?

sql-server - 压缩 sql 文件时 tar 命令失败

c# - Entity Framework 生成错误的 SQL

c# - Entity Framework : wrong return type of stored procedure

mysql - 在mysql数据库中创建角色

mysql - 将记录从 SQL Server DB 的一个实例插入到其他 SQL Server DB 实例

sql - 根据字段插入行

php - 更新数据库中的产品库存

mysql - 在不使用 Union 的情况下组合两个查询

c# - 无法找到请求的 .Net Framework 数据提供程序。 (SQL客户端)