Если у вас нет индекса для table2(TYPE)
, использовать подзапрос смертельно, так как вы будете многократно (для каждой строки TABLE1
) выполнять FULL TABLE SCAN .
Судя по всему, кэширование подзапроса Oracle, которое могло бы вас спасти, не сработало.
Функциональный подход будет не намного лучше, если только вы не реализуете какое-то кэширование результатов работы самостоятельно.
Но есть простое решение для предварительного вычисления количества в подзапросе и присоединения результата к TABLE1
.
Обратите внимание, что вычисляет только count
один раз для каждого типа и , а не для каждой строки таблицы TABLE1
with cnt as
(select type, count(*) cnt
from table2 group by type),
cnt2 as
(select type, count(*) cnt
from table3 group by type)
select a.ID,
a.FIELD1,
a.FIELD2,
a.TYPE,
b.cnt cnt1
c.cnt cnt2
from TABLE1 a
left outer join cnt b
on a.type = b.type
left outer join cnt2 c
on a.type = c.type
Вы получите один FTS
для каждой таблицы, агрегации и внешнего объединения, которое являетсяминимум, что вам нужно сделать.