我正在使用 LINQ 实现分页,并且正在考虑可能遇到的性能问题。假设我的页面大小为 10,并且我在表中有 100 条记录。如果我要使用以下
var myList = _dataContext.Person.Skip(PageNumber * PageSize).Take(10);
它会给我我想要的数据。现在,如果我要采用这种情况,并将其应用于 1,000,000 条记录。这会影响性能吗?在性能方面,使用 sql 存储过程是否更值得?
我正在使用 LINQ 实现分页,并且正在考虑可能遇到的性能问题。假设我的页面大小为 10,并且我在表中有 100 条记录。如果我要使用以下
var myList = _dataContext.Person.Skip(PageNumber * PageSize).Take(10);
它会给我我想要的数据。现在,如果我要采用这种情况,并将其应用于 1,000,000 条记录。这会影响性能吗?在性能方面,使用 sql 存储过程是否更值得?
在跳过和获取之前,这不会返回数据库中的所有行。如果你在ToList
之后做了一个.Person
,那么那将是非常低效的。你有什么应该没问题
与 Linq 提供程序为您生成的纯 SQL 文本相比,存储过程没有任何优势。
顺便说一句,您的查询将生成类似于以下 SQL 的内容
SELECT /* [t0] fields */
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY /* [t0] fields */
FROM [Person] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
它只会在你使用myList
变量时执行(例如 call ToList()
, Count()
, enumerate it)。因此,您在数据库中有多少人并不重要(好吧,这很重要,但这是数据库的一部分,而不是内存中的对象),并且您不会因使用存储过程而获得性能提升。