2016-08-22 36 views
0

我正在使用oracle。在查詢中對多個內部聯接進行排序以根據where子句提高性能Oracle

我有超過2個表來執行內部連接。而根據我的他們的排序問題的查詢表現。

下面是查詢:

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(在執行計劃中)的內部連接。

我的問題是:這可能嗎?另外,如果我根據最終的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諮詢,接受最好的計劃,並以自己爲基準,排序不會有幫助,長期使用提示表明perfs通常會再次受到影響(他們的問題是它們與代碼綁定,而諮詢不是) – Gar

+2

所有表上的表統計信息都是最新的嗎? –

+1

你是否擁有所有環境下的所有索引,特別是在外鍵列上? –

回答

0

感謝@sers

我還發現使用/*+ORDERED */比你早provided.But我只是想增加服務表現的一些證據的溶液中,該解決方案。

所以,我只是執行

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

我不能顯示實際的表輸出(所以省略表名),但我會在這裏發佈其他性能因素:

enter image description here

我知道, oracle可以找出最好的計劃,但強制執行計劃幫助我提高性能。在我的情況下,這是最糟糕的情況。

相關問題