如何使用WCF和SQL Server实现行分页

本文关键字:实现 分页 Server SQL 何使用 WCF | 更新日期: 2023-09-27 18:27:03

首先,我是WCF和SQL Server的新手。我正在开发一个连接WCF和SQL Server 2012的应用程序。我有一张表,其中的行有一百万条记录,而且这个数字还会不断增加。当客户端发送请求时,我会获取30行,然后如果用户请求,则显示接下来的30行,以此类推。我的要求是在WCF或SQL中进行分页。我有以下问题:

  1. 我想知道我应该在哪里实现分页概念,在WCF中还是在SQL Server中?哪种方法最快
  2. 如果我在WCF中实现它,我将使用LINQ的SkipTake运算符来获取请求的页面。这是正确的方式吗
  3. 如果我使用SQL,哪种方法将获得最快的结果OFFSET(或)ROW_NUMBER() OVER选项

由于我是新手,所以我知道这些方法。还有其他我不知道的方法吗?

如何使用WCF和SQL Server实现行分页

  1. 如果您想在SQL Server上分页,如果不是每个查询都会返回必须加载到内存中的一百万行,那么您会立即丢弃除30行之外的所有行。效率很低
  2. 这取决于你的意思。如果您使用的是类似实体框架的东西,使用SkipTake不会在内存中执行这些操作,它会将它们转换为sql查询并在sql中运行
  3. 如果您可以使用OFFSET,它将为您提供比ROW_NUMBER() OVER更好的性能

需要注意的一点是,如果您正在进行分页,则必须确保您的排序是确定的。订购时不能有领带,如果你允许领带,你可以在分页符上有一条。假设A行和B行被您的订单"捆绑":

  • 您对第1页运行查询,行a被认为在行B之前,行a显示为页面上的最后一项
  • 您对第2页运行查询,行B被认为在行a之前,行a显示为第2页上的第一项

您从未在上面的示例中显示过行B。解决这一问题的最简单方法是,始终确保在您的主键(或任何其他可以对其进行唯一索引的列集)上进行排序,作为最后一个排序依据,这样可以确保您永远不会有任何联系。