Будет ли Postgres кэшировать результат СХОДСТВА (или любого дорогостоящего вызова функции), если я использую его более одного раза в запросе?

#postgresql

#postgresql

Вопрос:

Допустим, я делаю что-то вроде этого:

     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
 

Я выполняю один и тот же SIMILARITY(c."body", $1) вызов 3 раза, что является самой дорогостоящей частью запроса. Будет ли Postgres выполнять это вычисление 3 раза? Или он заметит, что это уже сделано, и кэширует его?

Ответ №1:

Да, функция может вызываться несколько раз.

Используйте подзапрос, чтобы избежать этого:

 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;