【问题标题】:If I call the same postgres function with the same arguments twice in a query, does it calculate once or twice?如果我在查询中两次使用相同的参数调用相同的 postgres 函数,它会计算一次还是两次?
【发布时间】:2021-08-15 02:45:47
【问题描述】:

如果我在 postgres 中进行以下查询,是计算 ts_rank 两次还是只计算一次?如果计算两次,是否可以只计算一次?

SELECT id, name, "createdAt", price, ts_rank(document, to_tsquery(:query)) AS rank
FROM search_index
WHERE document @@ to_tsquery(:query)
ORDER BY ts_rank(document, to_tsquery(:query)) DESC;

【问题讨论】:

  • 取决于函数是标记为不可变、稳定还是易失,以及预测成本是多少。

标签: postgresql performance


【解决方案1】:

在这种情况下,它应该只计算一次。 Postgres 检测相等的表达式。一般来说,如果你担心这个,那么你可以在子查询中计算表达式。

有些喜欢:

SELECT c1, c1 FROM (SELECT exp AS c1) s;

没有fulltext index,函数to_tsquery() 非常昂贵。如果您有全文索引,并且只有一百条选定的记录,那么ts_rank 的开销应该不会很大。

【讨论】:

  • 感谢您提供更多信息,我已经使用CREATE INDEX idx_fts_search ON search_index USING gin(document); 设置了全文索引。
猜你喜欢
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多