在postgres中,是否可以优化UNION的VIEW

cc *_*ung 5 sql postgresql view query-optimization

数据库中有许多相同的模式,cmp01..cmpa0

每个模式都有一个users

每个模式的users表的主键都有自己唯一的范围

例如,在cmp01.usersisusr_id之间0x01000000 and 0x01ffffffff

有什么方法可以定义一个 VIEW global.users,它是每个表的联合,cmp*.union这样,如果通过 查询usr_id,优化器将前往正确的模式?

正在想这样的事情:

create view global.users as
select * from cmp01.users where usr_id between 0x01000000 and 0x01ffffffff
union all
select * from cmp02.users where usr_id between 0x02000000 and 0x02ffffffff
....
Run Code Online (Sandbox Code Playgroud)

这行得通吗?不。EXPLAIN ANALYZE 显示使用的所有模式。

是否有一种方法可以为优化器提供良好的提示?

小智 1

创建分区表怎么样?主表将创建为global.users模式名称,并按模式名称进行分区。

这样,您就可以获得每个模式中的小型用户表(包括快速检索),只要您可以创建 PostgreSQL 可以优化的查询,即在 where 条件中包含模式名称。您还可以在每个架构中创建一个视图,该视图将隐藏查询分区表所需的架构名称。我认为仅指定 user_id 是行不通的。我担心 PostgreSQL 的分区功能不够智能。

或者仅使用一个表,并使用替代触发器在每个模式中创建视图,并将结果限制为该模式的用户。