SQL Server 中两个表的分页

Ale*_*lex 5 sql t-sql sql-server

我有两张桌子,

  • Orders- 这很小,通常最多 5 万条记录
  • OrdersArchive- 这个是正常的,大约8000万条记录

这种情况可能会发生:

该订单可能具有以下值status

  1. ‘创造’
  2. '加工'
  3. '完成的'

已完成的订单Orders会定期移至OrdersArchive

换句话说,可能包含状态为、或 的Orders订单。仅包含状态为 的订单。createdprocessingfinishedOrdersArchivefinished

结果必须按“创建”、“处理”、“完成”顺序排序

我需要在这两个支持分页的表中进行查询。

最好的方法是什么?(尽可能快)

分页可以是任何类型

我的意思是:

  • 使用 PageNumber 和 CountOfRowsPerPage 的经典分页。
  • “惰性”分页,在特定订单之后显示订单计数。

Ben*_*ley 4

union我会为此使用SQL 运算符。有关详细信息,请参阅w3schools页面。

通过 union,您可以执行unionunion all。第一个将检查重复项,而第二个仅合并结果。听起来这两个表中不应该有重复项,因此为了性能,您不需要进行不同的搜索。

您还需要确保两个查询具有相同数量且类型相似的列。

例如

select orderno, status from Orders
union all
select orderno, status from OrdersArchive
order by status, orderno
Run Code Online (Sandbox Code Playgroud)

分页
该查询为您提供两个表的组合结果集。现在要添加分页,我将使用行号如下的 CTE:

with x as (
select orderno as num, status as stat from Orders
union all
select archiveorderno as num, archivestatus as stat from OrdersArchive
) select row_number() over(order by stat, num) as rownum, num, stat from x 
  where rownum between 1 and 20
Run Code Online (Sandbox Code Playgroud)

替代方案
如果您发现使用 union 太慢,那么您可以考虑更改搜索的工作方式。如果您始终以相同的方式排序,并且始终是来自 Orders 的记录,然后是来自 OrdersArchive 的记录,那么您可以单独查询这些表。首先对 Orders 进行分页,然后当您用完记录时,继续对 OrdersArchive 进行分页。这比联合要快得多,但您必须保持查询简单并始终按状态排序。该联盟允许更复杂的搜索。