Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Oracle.Функция в выборке и в условии - 2 раза будет вычисляться? [D7]


OW ©   (2011-08-26 11:18:00) 

select
-- T.DATE_BEGIN, T.DATE_END, T.OPERATION_DATE, T.STATUS
 T.*,
 S.DEV_ID, S.DATE_BEGIN, S.DATE_END, S.INSERT_DATE,
 U.ACCOUNT, U.NAME,
  dvbt_deptors.get_debet_saldo('main', s.user_id) SALDO
from
 TABLE(CAST(DVBT_DEPTORS.GET_ON_STATUS('main', '2', 'both',
                                            to_char(SYSDATE - 2, 'dd.mm.yyyy'),
                                            to_char(SYSDATE + 1, 'dd.mm.yyyy')
                                      ) AS DVBT_GETONSTATUS_TABLE
           )
       ) T
       join MAIN.T_SERVICES S on S.SERV_FIRST_ID = T.SERV_FIRST_ID
       join MAIN.T_SVC_REF SR on SR.SVC_ID = S.SVC_ID
       join MAIN.T_USERS U on U.USER_ID = S.USER_ID
where
 SR.COD = '5500'
 AND SR.ISCONST = 'Y'
and dvbt_deptors.get_debet_saldo('main', s.user_id) < 0
order by
T.OPERATION_DATE desc

очень уж она накладная, не хотелось бы 2 раза


OW   (2011-08-26 17:00:00) [1]

спасибо


Игорь Шевченко   (2011-08-26 15:49:00) [2]


> очень уж она накладная, не хотелось бы 2 раза


Во-первых, ее может вычислять один раз оптимизатор - он не дурак.
Во-вторых, ее можно засунуть во view
В-третьих, по возможности
ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
наше все


Кщд   (2011-08-26 12:51:00) [3]

>правда что-то еще дольше стало..
не сравнивайте планы


OW   (2011-08-26 11:40:00) [4]

правда что-то еще дольше стало..

select
*
from (
 select
   T.DATE_BEGIN TDATE_BEGIN, T.DATE_END TDATE_END, T.OPERATION_DATE, T.STATUS,
   S.DEV_ID, S.DATE_BEGIN, S.DATE_END, S.INSERT_DATE,
   U.ACCOUNT, U.NAME,
   dvbt_deptors.get_debet_saldo('main', s.user_id) SALDO
 from
   TABLE(CAST(DVBT_DEPTORS.GET_ON_STATUS('main', '2', 'both',
                                              to_char(SYSDATE - 2, 'dd.mm.yyyy'),
                                              to_char(SYSDATE + 1, 'dd.mm.yyyy')
                                        ) AS DVBT_GETONSTATUS_TABLE
             )
         ) T
         join MAIN.T_SERVICES S on S.SERV_FIRST_ID = T.SERV_FIRST_ID
         join MAIN.T_SVC_REF SR on SR.SVC_ID = S.SVC_ID
         join MAIN.T_USERS U on U.USER_ID = S.USER_ID
 where
   SR.COD = '5500'
   and SR.ISCONST = 'Y'
) A  
where
 A.SALDO < 0  
order by
 A.OPERATION_DATE desc


OW   (2011-08-26 11:29:00) [5]

select * from (
select
-- T.DATE_BEGIN, T.DATE_END, T.OPERATION_DATE, T.STATUS
T.*,
S.DEV_ID, S.DATE_BEGIN, S.DATE_END, S.INSERT_DATE,
U.ACCOUNT, U.NAME,
 dvbt_deptors.get_debet_saldo('main', s.user_id) SALDO
from
TABLE(CAST(DVBT_DEPTORS.GET_ON_STATUS('main', '2', 'both',
                                           to_char(SYSDATE - 2, 'dd.mm.yyyy'),
                                           to_char(SYSDATE + 1, 'dd.mm.yyyy')
                                     ) AS DVBT_GETONSTATUS_TABLE
          )
      ) T
      join MAIN.T_SERVICES S on S.SERV_FIRST_ID = T.SERV_FIRST_ID
      join MAIN.T_SVC_REF SR on SR.SVC_ID = S.SVC_ID
      join MAIN.T_USERS U on U.USER_ID = S.USER_ID
where
SR.COD = '5500'
AND SR.ISCONST = 'Y'
)
where SALDO < 0

если так..


Наверх

Титульная страница Поиск, карта сайта Написать письмо