Упростил реальный кейс до двух таблиц (объекты и связи между объектами) и функции, которая по id объекта возвращает id привязанного к нему объекта. Суть в использовании именно функции для джойна, а не прямом джойне таблиц.
Заполняем таблицы небольшим количеством данных — в примере всего 500 объектов, половина из которых имеет связь. http://sqlfiddle.com/#!15/4881e1/6 и делаем два запроса с джойном функции:
/* (SLOW) */
-- функция вызывается 500*500 раз, после чего делается джойн вложенным циклом
-- Execution Time: 5242ms
explain analyze select obj.id, ot.id
from toobject obj
left join toobject ot on ot.id = to_getidref(obj.id);
/* (FAST) */
-- функция вызывается 500 раз в сабквери, после чего делается хеш джойн
-- Execution Time: 19ms
explain analyze select obj.id, ot.id
from toobject obj
left join toobject ot on ot.id = (select to_getidref(obj.id));
спрошу-ка тут еще. #02UUZH - скажи, есть ли разница?
@tree_hugger Разницы не должно быть, но всегда лучше перепроверить (я не эксперт). Индексированные вьюхи могут дать ускорение, но их приходится обновлять, когда меняются данные в нижележащих таблицах.
@kogda окк, сяб.