У меня очень сложное представление, которое имеет вид ниже
create or replace view loan_vw as
select * from (with loan_info as (select loan_table.*,commission_table.*
from loan_table,
commission_table where
contract_id=commission_id)
select /*complex transformations */ from loan_info
where type <> 'PRINCIPAL'
union all
select /*complex transformations */ from loan_info
where type = 'PRINCIPAL')
Теперь, если я сделаю следующее, выберите запрос, зависает
select * from loan_vw where contract_id='HA001234TY56';
Но если я жестко закодировал внутри подзапросарефакторинг или использование переменной уровня пакета в том же сеансе, запрос возвращается в секунду
create or replace view loan_vw as
select * from (with loan_info as (select loan_table.*,commission_table.*
from loan_table,
commission_table where
contract_id=commission_id
and contract_id='HA001234TY56'
)
select /*complex transformations */ from loan_info
where type <> 'PRINCIPAL'
union all
select /*complex transformations */ from loan_info
where type = 'PRINCIPAL')
Поскольку я использую бизнес-объект, я не могу использовать переменную уровня пакета
Так что мой вопрос есть подсказка вOracle сообщает оптимизатору сначала проверить значение contract_id в loan_vw в рефакторинге подзапроса
. В соответствии с запросом используется следующая аналитическая функция:
select value_date, item, credit_entry, item_paid
from (
select value_date, item, credit_entry, debit_entry,
greatest(0, least(credit_entry, nvl(sum(debit_entry) over (), 0)
- nvl(sum(credit_entry) over (order by value_date
rows between unbounded preceding and 1 preceding), 0))) as item_paid
from your_table
)
where item is not null;
После следования советам, данным Boneist и MarcinJ Iудалил рефакторинг подзапроса (CTE) и написал один длинный запрос, подобный приведенному ниже, который повысил производительность с 3 минут до 0,156 секунд
create or replace view loan_vw as
select /*complex transformations */
from loan_table,
commission_table where
contract_id=commission_id
and loan_table.type <> 'PRINCIPAL'
union all
select /*complex transformations */
from loan_table,
commission_table where
contract_id=commission_id
and loan_table.type = 'PRINCIPAL'