我想允许执行PL / PGSQL函数(my_function
),只要它的参数(my_table.x
)属于预定义的时间间隔(例如[100,1000])。
我们采用以下查询示例:
(q)SELECT * FROM my_table WHERE my_function(mytable.x);
我希望此查询自动重写以检查mytable.x
是否属于区间[100,1000]:
(q')SELECT * FROM my_table WHERE (my_table.x BETWEEN 100 AND 1000) AND my_function(my_table.x);
命令EXPLAIN ANALYSE
表明第二个查询确实比第一个查询快。
如何更改查询执行计划以自动执行查询重写(q进入q')?
我在哪里可以适当地存储与my_function
相关的区间[100,1000]的元数据?
先谢谢,
Thomas Girault
我需要的帮助将有助于一个关于将模糊逻辑集成到PostgreSQL中的项目:[https://github.com/postgresqlf/PostgreSQL_f/] [PostgreSQLf]
答案 0 :(得分:1)
捕获它的最快方法是在函数体顶部
IF $1 BETWEEN 100 AND 1000 THEN
-- proceed
ELSE
RETURN NULL; -- Or what ever you want to return in this case
END IF;
这应该非常快。
使用PostgreSQL中的RULE
system完成实际查询重写。但规则适用于表和视图,而不适用于函数。您可以将查询包装在视图中 - 但是您可以显式添加附加条件,这样更便宜。
CREATE VIEW v_tbl_only_valid_x AS
SELECT *
FROM tbl
WHERE x BETWEEN 100 AND 1000;
呼叫:
SELECT * FROM v_tbl_only_valid_x WHERE my_function(x);
这样,查询计划程序可以显式获取有关查询对x
列的选择性的信息,这可能会导致查询计划不同。
但在WHERE
中添加第二个q'
条件并不是更简单吗?