wurdu |
---|
vavan, то, что ты хочешь, называется Join Elimination. Oracle постепенно увеличивает кол-во случаев, когда оно применяется, но данный случай, похоже, еще не охвачен. Можно использовать scalar subquery: Но производительность может упасть (как и увеличиться). |
вот это уже ближе к телу :)
в реальности есть монструозная вьюха, часть полей которой достается агрегатными подзапросами. и там где достается единственный агрегат я давно уже переписал именно на тот вид что ты предлагаешь, молодец :) сделал это после того как увидел что оракл окровенно тупит открывая подобные запросы, даже если не достаются те самые агрегаты из подзапросов. после переписывания на scalar subquery ситуация пролечилась, т.е. если нет в результирующей выборке полей-агрегатов то и подзапрос не открывается нестедлупом. но это повторюсь простые случаи с единственным агрегатом. а есть у меня еще и такие которые возвращают сразу множество агрегатов из одного подзапроса. типа такого:
select * from (select много_всего) v, (SELECT c.Account_Id SRAcc,
MAX (Spread_Remainder) SRMax,
SUM (Spread_Remainder) SpreadRemainder,
MIN (cs.Object_No)
KEEP (DENSE_RANK FIRST ORDER BY Spread_Remainder DESC)
SR,
MIN (c.Date_In)
KEEP (DENSE_RANK FIRST ORDER BY spread_remainder DESC)
SRDateIn,
MIN (cs.Spread_Volume)
KEEP (DENSE_RANK FIRST ORDER BY spread_remainder DESC)
SRVol,
MIN (cs.Spread_Cost)
KEEP (DENSE_RANK FIRST ORDER BY Spread_Remainder DESC)
SRCost
FROM tcontractspread cs, tcontract c
WHERE cs.object_no = c.object_no
AND SYSDATE BETWEEN c.Date_In AND c.Date_Out
GROUP BY c.Account_Id) sr WHERE v.Acc = sr.SRAcc(+)
дак вот тут такое переписывание уже не кошерно делать казалось бы, т.к. породит кучу скалярных подзапросов. или это неизбежно?