通过查询重写避免执行某些PL / PGSQL函数

时间:2012-05-24 12:29:42

标签: postgresql query-optimization plpgsql

我想允许执行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]

1 个答案:

答案 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'条件并不是更简单吗?