我需要从具有多个 select 语句的
union all
定义的视图中选择数据(每个表有 500K 条记录),但希望为每条记录生成行号。
查看定义:
Create or replace view ABC as
Select * from table_1
union all
Select * from table_2
union all
Select * from table_3
union all
Select * from table_4
union all
Select * from table_5
union all
Select * from table_6
union all
Select * from table_7
union all
.
.
.
.
Select * from table_n
创建视图后,我需要提取数据,但生成返回的到达记录的记录数:
Select *,
row_number() over() as record_id
from ABC
我尝试遵循方法,但无法获得想要的结果,
Select *
视图继续运行。
是否有更好的方法来实现上述场景?
如果您确实需要为每次下一次调用的所有行提供确定性的、无间隙的数字,并且所有基础表的行都可以随时更改,那么这将是非常昂贵的。
但这不是你所展示的。对于初学者来说,没有
row_number() over()
的 ORDER BY
会产生 任意 数字。自从 Postgres 15 的查询计划中出现“并行追加”以来,从查询返回的行序列实际上可能会无缘无故地发生变化。参见:
这很可能不是您所需要的。数百万行的完全不稳定的、任意的行号几乎没有任何用处。精确定义您的目标,并且可能有一条(大量)更快/更好的路线。
VIEW
与 MATERIALIZED VIEW
(实际存储数据)的性质的假设可能是错误的?