我想创建一个视图,它将根据运行时的会话变量(set_config)在两个可能的选择之间进行选择。
今天,我通过以下方式在两个选项之间通过“联合所有”来实现:
create view my_view as (
select * from X where cast(current_setting('first_select') as int)=1 and ...;
union all
select * from Y where cast(current_setting('first_select') as int)=0 and ...;
)
问题在于,当目标是联盟时,Postgres优化器会做出错误的决定。 所以,当我跑来跑去时:
select * from my_view where id in (select id from Z where field='value')
虽然它有一个“id”索引,但它决定对表X进行全面扫描 有没有另一种方法来定义这样的视图而不使用“union”子句?
答案 0 :(得分:1)
将 OR 一起放入WHERE子句中。优化器将找到不变条件。
CREATE VIEW my_view AS (
SELECT * FROM X WHERE
( cast(current_setting('first_select') as int)=1 AND <condition1> )
OR ( cast(current_setting('first_select') as int)=0 AND <condition2> )
...
)
;