Oracle SQL - форсирование плана выполнения со сложными представлениями - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть представление (давайте назовем его «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 строк(и используйте предложение «с», может быть важно указать на это).

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...