0

我有一个带有返回大量行的视图的 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)

4

0 回答 0