вызываться или по числу строк?
select order_id, get_user_hash(user_id) from orders;
А есть какое-то разумное объяснение этому?
Вряд-ли, когда то на sql.ru разбирали, почему с функциями дат такое происходит. Но не помню чем дело закончилось, а обсуждение не сохранил.
Хотя если подумать, stable гарантирует, что при одних и тех же входных значений получишь тот же результат. Но, вроде, ни где не говорить что в кэше храниться некая мапа вход:выход
оптимально - это как?
Если там на 1000 заказов 10 уникальных пользователей,то только 10 раз
поставить в функцию raise notice и посмотреть?
Ну, было бы хотя бы один раз на запрос -- постгрес бы оптимизировал. А так -- ну, нет тут такой оптимизацыи с запоминанием предыдущих результатов stable функцый.
выше уже писали, у postgres нет кеша результатов функций, он может оптимизировать количество вызовов только у функций вызывающихся с константными аргументами (с помощью её выполнения при планировании и встраивания результата в план запроса), если в аргументе переменная (имя колонки например) то он будет вызывать её каждый раз, даже с атрибутом immutable
Т.е. здесь может помочь CTE Materialized с предвычислением хеша и последующим join'ом?
да, как вариант
Здесь может помочь перестроить запрос. Сначала выбрать с аггрегатом по user_id, потом взять хэш от user_id, потом делать то, что хотите
Можэт, в принцыпе. На самом деле -- join, возможно, поможэт и без CTE.
Обсуждают сегодня