0

我希望my_function仅当 PL/PGSQL 函数 ( ) 的参数 ( 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 into q')的过程?我在哪里可以适当地存储有关区间 [100,1000] 的元数据my_function

预先感谢,

托马斯·吉罗

我需要的帮助将帮助一个关于将模糊逻辑集成到 PostgreSQL 中的项目:[https://github.com/postgresqlf/PostgreSQL_f/][PostgreSQLf]

4

1 回答 1

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系统完成的。但是规则适用于表和视图,而不是函数。您可以将查询包装在视图中 - 但随后您可以显式添加附加条件,这样更便宜。

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'吗?

于 2012-05-24T12:39:33.037 回答