Конференция "Базы" » Oracle.Функция в выборке и в условии - 2 раза будет вычисляться? [D7]
 
  • OW © (26.08.11 11:18) [0]
    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 © (26.08.11 11:29) [1]
    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

    если так..
  • OW © (26.08.11 11:40) [2]
    правда что-то еще дольше стало..

    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
  • Кщд (26.08.11 12:51) [3]
    >правда что-то еще дольше стало..
    не сравнивайте планы
  • Игорь Шевченко © (26.08.11 15:49) [4]

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


    Во-первых, ее может вычислять один раз оптимизатор - он не дурак.
    Во-вторых, ее можно засунуть во view
    В-третьих, по возможности
    ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
    наше все
  • OW © (26.08.11 17:00) [5]
    спасибо
 
Конференция "Базы" » Oracle.Функция в выборке и в условии - 2 раза будет вычисляться? [D7]
Есть новые Нет новых   [134431   +11][b:0][p:0]