首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免通过查询重写执行某些PL/PGSQL函数

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

Stack Overflow用户
提问于 2012-05-24 20:29:42
回答 1查看 174关注 0票数 0

我希望仅当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/

EN

回答 1

Stack Overflow用户

发布于 2012-05-24 20:39:33

捕获它的最快方法是在函数体的顶部执行以下操作

代码语言:javascript
运行
复制
IF $1 BETWEEN 100 AND 1000 THEN
   -- proceed
ELSE
   RETURN NULL; -- Or what ever you want to return in this case
END IF;

这应该是非常快的。

实际的查询重写是使用PostgreSQL中的 完成的。但规则适用于表和视图,而不适用于函数。您可以将查询包装在视图中-但随后您可以显式添加额外的条件,这会更便宜。

代码语言:javascript
运行
复制
CREATE VIEW v_tbl_only_valid_x AS 
    SELECT *
    FROM   tbl
    WHERE  x BETWEEN 100 AND 1000;

呼叫:

代码语言:javascript
运行
复制
SELECT * FROM v_tbl_only_valid_x WHERE my_function(x);

这样,查询规划器就会显式地获得关于列x上查询选择性的信息,这可能会导致不同的查询计划。

但是,像在q'中一样,在查询中添加第二个WHERE条件不是更简单吗

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10737530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档