Ale*_*lex 5 sql t-sql sql-server
我有两张桌子,
Orders
- 这很小,通常最多 5 万条记录OrdersArchive
- 这个是正常的,大约8000万条记录这种情况可能会发生:
该订单可能具有以下值status
:
已完成的订单Orders
会定期移至OrdersArchive
。
换句话说,可能包含状态为、或 的Orders
订单。仅包含状态为 的订单。created
processing
finished
OrdersArchive
finished
结果必须按“创建”、“处理”、“完成”顺序排序
我需要在这两个支持分页的表中进行查询。
最好的方法是什么?(尽可能快)
分页可以是任何类型
我的意思是:
union
我会为此使用SQL 运算符。有关详细信息,请参阅w3schools页面。
通过 union,您可以执行union
或union 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 进行分页。这比联合要快得多,但您必须保持查询简单并始终按状态排序。该联盟允许更复杂的搜索。
归档时间: |
|
查看次数: |
5414 次 |
最近记录: |