【问题标题】:Huge data set Cursor Based Pagination with Web API & SQL Server queries使用 Web API 和 SQL Server 查询的庞大数据集基于游标的分页
【发布时间】:2021-08-19 21:55:36
【问题描述】:

我有一个包含 3000 万条记录的表,我们正在使用 SQL 服务器查询来提取数据。

SELECT FruitName, Price
FROM SampleFruits
ORDER BY Price
OFFSET 5 ROWS FETCH NEXT 20 ROWS ONLY

使用上述偏移量(页面)和获取(行)的方法,我们遇到了性能问题,因为偏移量需要扫描所有记录,直到它导致问题的偏移量。

我正在查看不同的选项,我发现大型数据集的建议是基于光标的分页。基于游标的分页在 SQL 查询中是什么样子的,我们应该在查询本身中包含上一页和下一页以将其发送给消费者,参数是什么样的?

查询如何在结果集中给出 prev 和 next ?

{  
    Fruits:[  
        {  
            name: "Oraange",  
            shelfLife: "2021-06-15",  
            weight: "30 Lbs"  
        },  
        ...  
    ],  
    nextPage: "?",  
    previousPage: ?,
    totalRecords: ?
}  

在 Web API 中,我们在哪里设置查询中的 nextPage 和 previousPage 或在 C# 中的业务层形成它?

获取 totalRecords 是一个单独的查询?

当他们想倒退时,我们是否需要将查询更改为设置上一页、下一页。 SQL server 中基于 Cursor 的分页中的查询基本上是什么样的,以及 nextpage 和 previousPage 在 sql 查询中设置或在 C# 中完成的位置。另外,Web API 的查询参数是什么?

【问题讨论】:

  • 似乎评论和答案已经包含所有信息。如果您只需要下一个和上一个(而不是导航到特定页码),只需在下一个上执行“> last id”查询,在上一个导航上执行“
  • 我无法相信拥有 3000 万条记录的表,您的用户最多会获取超过 10-20 个页面。如果是这种情况,那么您可能需要考虑一种只检索几百行的方法。

标签: c# sql-server asp.net-web-api pagination


【解决方案1】:

通常的建议是:

  • 永远不要获取totalRecords,因为它通常比获取页面更昂贵。

  • 使用表单的分页查询

像这样:

SELECT top (@rows) FruitName, Price
FROM SampleFruits
WHERE ID > @lastId
ORDER BY Price, ID

从上一页传递最后一个 ID 以获取下一页,并始终确保 ORDER BY 是唯一的,并由索引支持。

【讨论】:

  • 谢谢.. 在 C# 逻辑中,我在哪里形成下一页和上一页 URL?如果我使用上一页链接,我应该使用 ID "@lastid" 吗?什么是查询参数,我认为“@rows”是我们可能需要多少行,“@lastId”是另一个会执行 ID >“@lastId”的行,但是当用户想要导航回来时,我们该怎么走背部 ?我假设myapplication/fruits?rows=25&lastId=1001 是 URL,但是 Id 如何确定上一个和下一个链接的 lastId 以在 Json 中形成并返回给用户?
  • Prashant 是什么?它与问题无关。
【解决方案2】:

如果您阅读此处的“基于光标的分页”,我想您会理解 https://daily.dev/blog/pagination-in-graphql

光标应该是唯一的,理想情况下可以排序,如 Id 或日期时间等。

【讨论】:

  • 欢迎来到 Stack Overflow!我建议不要在答案中使用修辞问题。他们冒着被误解为根本不是答案的风险。您正在尝试回答此页面顶部的问题,不是吗?否则请删除此帖。
  • 我删除了你的问题。如果您想提供更多讨论,可以将其移至此处的评论中。没有该问题的答案似乎与适当的摘要链接,即 StackOverflow 的一个不错的答案。玩得开心。
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
猜你喜欢
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2017-05-01
  • 1970-01-01
  • 2013-11-27
  • 2019-02-18
  • 2017-05-20
相关资源
最近更新 更多