我有一个带有返回大量行的视图的 SQL Server 数据库。在我的项目中,LinqToSql 正在对视图进行排序和分页,以显示在数据网格中。
加载第一页的性能是可以接受的,但是随着分页深入到视图中,加载每个页面的速度会降低。到达视图的最后一页,加载页面需要很长时间。
linq-to-sql to page生成的SQL是
SELECT [t1].[Client Id]
...
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [t0].[Last Name]) AS [ROW_NUMBER],
[t0].[Client Id],
...
FROM [dbo].[View_MemberEligibilitySearch] AS [t0]) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN 50 /* @p0 */ + 1 AND 50 /* @p0 */ + 15 /* @p1 */
ORDER BY [t1].[ROW_NUMBER]
有什么方法可以从 SQL Server 的角度进行优化?用于生成视图的表中已经有所有需要的索引。是否可以将索引添加到视图本身以提高此类查询的性能?
我意识到这个问题可以通过不使用视图来解决,但我正在寻找不需要大量代码更改的东西。
有什么方法可以通过 Linq-To-Sql 进行分页视图有效吗?
编辑
更多细节。该视图当前有 350k 条记录。
前 10 秒需要 0 秒,最后需要 15 秒。时间与选择全桌类似。
执行计划对具有相同 350k 记录的表的聚集索引扫描占 99%。(视图的所有其他部分都是查找表,它们几乎不需要时间,因为它们来自主键)
这个问题可以在任何 View 上重现 create a view from select * from MyBigTable
LinqToSql 调用中的映射表
MyTable.Skip(100000).Take(10)