我有从多个选择语句的union all
定义视图中选择数据的要求(每个表有50万条记录),但希望为每条记录生成行号。
视图定义:
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 *
继续运行。
是否有更好的方法来实现上述场景?
1条答案
按热度按时间f0ofjuux1#
如果您实际上需要为每个下一次调用的所有行提供确定性的、无间隙的数字,并且所有基础表的行可以随时更改,那么代价将非常昂贵。
但这并不是你所展示的。对于初学者来说,没有
ORDER BY
的row_number() over()
会产生任意数字。自从Postgres 15的查询计划中出现“并行追加”以来,从查询返回的行序列实际上可以毫无理由地改变。请参阅:这很可能不是你所需要的。一个完全不稳定的、任意的行数对于数百万行几乎没有任何用处。精确地定义你的目标,可能会有一个(大大)更快/更好的路线。
也许是对
VIEW
(基本上只是存储的SELECT
查询)与MATERIALIZED VIEW
(实际上存储数据)的性质的错误假设?