我希望仅当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的元数据?
先谢谢你,
托马斯·吉罗
我需要的帮助将有助于将模糊逻辑集成到PostgreSQL中的项目: https://github.com/postgresqlf/PostgreSQL_f/
发布于 2012-05-24 20:39:33
捕获它的最快方法是在函数体的顶部执行以下操作
IF $1 BETWEEN 100 AND 1000 THEN
-- proceed
ELSE
RETURN NULL; -- Or what ever you want to return in this case
END IF;这应该是非常快的。
实际的查询重写是使用PostgreSQL中的 完成的。但规则适用于表和视图,而不适用于函数。您可以将查询包装在视图中-但随后您可以显式添加额外的条件,这会更便宜。
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上查询选择性的信息,这可能会导致不同的查询计划。
但是,像在q'中一样,在查询中添加第二个WHERE条件不是更简单吗
https://stackoverflow.com/questions/10737530
复制相似问题