我有一个以下表格的表格:
[mytable] id,min,max,funobj ----------------------------------------- 1 15 23 {some big object} 1 23 41 {another big object} 1 19 27 {next big object}
CREATE VIEW functionvalues AS SELECT id,evaluate(funobj) FROM mytable
其中evaluate是一个返回函数,用于评估大型funobj.视图的结果可能是这样的:
id,evaluate -------------- 1 15 1 16 1 ... 1 23 2 23 2 24 2 ... 2 41 ...
我没有关于评估将返回的具体值的任何信息,但我知道它们总是介于mytable(包括边界)中给出的最小值和最大值之间
最后,我(或更好的是,第三方应用程序)对视图进行查询:
SELECT * FROM functionvalues WHERE evaluate BETWEEN somevalue AND anothervalue
在这种情况下,Postgres会对mytable中的每一行评估函数evaluate,而根据where子句,如果函数的max和min不在给定值之间,则不必对其求值.由于评估是一个相当缓慢的功能,这给我带来了非常糟糕的表现.
SELECT * FROM ( SELECT id,evaluate(funobj) FROM mytable WHERE max BETWEEN somevalue AND anothervalue OR min BETWEEN somevalue AND anothervalue OR (min < somevalue AND max > anothervalue) ) AS innerquery WHERE evaluate BETWEEN somevalue AND anothervalue
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。