У меня есть представление (давайте назовем его «main_view»), полагающееся на другое представление в той же базе данных (view_1) и другое представление в другой базе данных (доступ по ссылке db, view_2).Например:
create or replace view main_view as
select
...
from (
select
...
from (
select
case when (select xxx from view_1 z where z.id=a.id)='xxx' and ... then ...
when (select yyy from view_2 z where z.id=a.id)='yyy' and ... then ...
else ...
end as c1,
...
from table_1 a, table_2 b, ...
where a.id=b.id and ...
) a
) a
Если main_view используется таким образом, производительность так же хороша:
select * from main_view a where a.id in ('x','y',...)
Но если main_view используется, как любое из следующих действий, производительность ужасна (table_n содержит 1 тыс. строк):
select a.* from main_view a, table_n b where a.id=b.id;
или
select * from main_view a where a.id in (select z.id from table_n z);
В плане выполнения показано, что хранилище доступа к таблице парных пар выполнено полностью (в представлении).
Isесть ли способ заставить план выполнения решить «все, кроме main_view», а затем присоединиться к main_view по id?
В качестве крайней меры я попытался использовать такие подсказки, как «упорядоченный», «ведущий», «use_nl»и больше, но не удалось (может быть, неправильно использовали подсказки).
select/*+leading(b a)*/ a.* from main_view a, table_n b where a.id=b.id;
select/*+no_merge(b)*/ a.* from main_view a, table_n b where a.id=b.id;
select/*+use_nl(b a)*/ a.* from main_view a, table_n b where a.id=b.id;
select/*+ordered*/ a.* from table_n b, main_view a where a.id=b.id;
Есть идеи?
План выполнения - 400+ строк, а реальные представления - также более 100 строк(и используйте предложение «с», может быть важно указать на это).
Заранее спасибо