gpt4 book ai didi

postgresql - 在 PostgreSQL View 中自动重新制定条件

转载 作者:行者123 更新时间:2023-11-29 11:37:12 26 4
gpt4 key购买 nike

我有一个如下形式的表格:

[mytable]
id, min, max, funobj
-----------------------------------------
1 15 23 {some big object}
1 23 41 {another big object}
1 19 27 {next big object}

现在假设我有一个这样创建的 View :

CREATE VIEW functionvalues AS
SELECT id, evaluate(funobj)
FROM mytable

其中 evaluate 是一个集合返回函数,用于计算大型 funobj。 View 的结果可能是这样的:

id,  evaluate
--------------
1 15
1 16
1 ...
1 23
2 23
2 24
2 ...
2 41
...

我没有关于 evaluate 将返回的具体值的任何信息,但我知道它们将始终介于 mytable 中给出的最小值和最大值之间(包括边界)

最后,我(或更好的第三方应用程序)对 View 进行查询:

SELECT * FROM functionvalues 
WHERE evaluate BETWEEN somevalue AND anothervalue

在这种情况下,Postgres 会为 mytable 中的每一行计算函数 evaluate,而根据 where 子句,如果函数的最大值和最小值不在给定值之间,则不必计算该函数。由于评估是一个相当慢的函数,这给我带来了非常糟糕的性能。

更好的方法是直接使用查询表

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

有什么方法可以告诉 postgres 使用像上面那样的查询(通过智能索引或类似的东西)而不改变第三方应用程序查询 View 的方式?

P.S.:请随意为这个问题提出一个更好的标题,我给的标题相当......嗯......不具体。

最佳答案

我没有完整的答案,但你的一些流行语在我脑海中敲响了遥远的钟声:

  • 你有意见
  • 您想要更智能的 View
  • 你想“重写” View 定义

这需要 PostgreSQL Rule System ,尤其是“ View 和规则系统”部分。也许你可以利用它来发挥你的优势。

请注意:这是危险的东西。首先你会发现它很棒,然后你会抚摸它,然后它会在没有任何警告的情况下撕裂你的 ARM ,同时还在发出呼噜声。点击 here 中的链接.

关于postgresql - 在 PostgreSQL View 中自动重新制定条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7645899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com