2016-08-22 2 views
0

Я работаю в oracle.Заказ нескольких внутренних соединений в запросе для повышения производительности на основе того, где статья Oracle

У меня есть более двух таблиц для выполнения внутреннего соединения. И, по моему мнению, их порядок имеет значение для выполнения запросов.

Ниже приведен запрос:

select * from 
FROM A a 
INNER JOIN B b 
ON a.b_ID=b.id 
INNER JOIN C c 
ON c.id=a.c_Id 
INNER JOIN D d 
ON a.d_ID=d.id 
INNER JOIN E e 
ON e.d_id =d.id 
where e.name='abc' AND e.company_name='xyz'; 

В моем случае я не требую полного сканирования таблицы таблиц A, B, C, D.

Я хочу, чтобы применить предикат фильтр name и company_name, а затем применить внутреннее объединение таблиц A, B, C, D (в плане выполнения).

Мой вопрос: возможно ли это?

Кроме того, если я изменю порядок внутреннего соединения на основе предложения final where, это может повысить производительность (например, запрос ниже)?

select * from 
E e INNER JOIN D d 
ON e.d_id =d.id 
INNER JOIN A a 
ON a.d_ID=d.id 
INNER JOIN B b 
ON a.b_ID=b.id 
INNER JOIN C c 
ON c.id=a.c_Id 
where e.name='abc' AND e.company_name='xyz'; 

Даже после применения этого изменения я обнаружил, что в некоторых средах DB план выполнения одинаковый для двух запросов.

Есть ли способ, которым я могу заказать шаги плана выполнения во время выполнения запроса, например, явно указывая порядок внутреннего соединения?

Благодаря

+1

Лучше всего: запустите te advisory, примите лучший план и сравните себя, заказ не помог, а использование подсказок в долгосрочной перспективе показало, что перфомансы, как правило, снова будут страдать (их проблема в том, что они привязаны к коду , в то время как рекомендация не является) – Gar

+2

Являются ли статистика таблицы актуальной для всех таблиц? –

+1

И есть ли у вас все индексы, которые вы думаете во всех средах, особенно на столбцах внешнего ключа? –

ответ

0

Благодаря @sers

Я также нашел это решение с использованием /*+ORDERED */ ранее, чем решение вы provided.But я просто хотел некоторые доказательства повышенной Performace.

Так что я только что выполнили

explain plan for sql_query; 
select plan_table_output from table(dbms_xplan.display('plan_table',null,'typical')); 

Я не могу показать фактический вывод таблицы (так опуская имена таблиц), но я буду размещать другие факторы производительности здесь:

enter image description here

Я знаю, что oracle может определить лучший план, но форсирование плана выполнения помогло мне повысить производительность. Также в моем случае это худший сценарий.

2

Если вы действительно хотите, чтобы пойти на это, вы можете использовать оптимизатор подсказку: https://docs.oracle.com/cd/B12037_01/server.101/b10752/hintsref.htm#5555

Но вообще-то я бы не рекомендовал его - если статистика таблицы в актуальном состоянии, база данных должна хорошо иметь возможность определить лучший план выполнения (особенно для такого простого запроса).