首页 > 解决方案 > 如果我在查询中多次使用它,Postgres 会缓存 SIMILARITY(或任何昂贵的函数调用)结果吗?

问题描述

假设我做了这样的事情:

    SELECT c."id", ..., SIMILARITY(c."body", $1) as "similarity"
    FROM "comments" AS c
    WHERE SIMILARITY(c."body", $1) > 0.2
    ORDER BY SIMILARITY(c."body", $1) DESC
    LIMIT 10

我进行了 3 次完全相同的SIMILARITY(c."body", $1)调用,这是查询中最昂贵的部分。Postgres 会执行 3 次计算吗?还是它会注意到它已经完成并缓存它?

标签: postgresql

解决方案


是的,该函数可以被多次调用。

使用子查询来避免这种情况:

SELECT c.id,
       similarity
FROM (SELECT id,
             SIMILARITY(c."body", $1) AS similariity
      FROM comments) AS c
WHERE similarity > 0.2
ORDER BY similarity DESC
LIMIT 10;

推荐阅读