2011-07-05 27 views
1

考慮EMP,DEPT示例 在deptno的上下文中查詢EMP表是非常常見的。如果您經常 查詢:在連接查詢中沒有選擇外鍵索引

select * from dept, emp 
where emp.deptno = dept.deptno and dept.deptno = :X; 

我有一個指數deptNo_idx員工的桌子。但是每當我看到執行計劃時,這個索引就不會被使用。甚至給索引暗示沒有用

任何想法如何在外鍵列上使用索引?

回答

4

當您試圖理解優化器行爲時,EMPDEPT表不是特別好用的表。它們非常小,優化器會經常正確地確定全表掃描比索引訪問更有效。此外,值相對較少,因此優化器知道它將不得不從EMP表中獲取相對較大比例的行。由於表中的行數很少,並且您需要爲任何給定的值獲取大部分行,所以表掃描將更有效。

如果表格較大並且有更多的部門,優化器將更有可能確定使用索引會更有效。

+0

實際上我只是用這些表格來清楚地表達問題。在索引性能有效的情況下,實際表格會很大 – dpsdce

+0

@Dhirendra - 如果使用不同表格存在特定問題,請發佈表格定義,查詢計劃,查詢以及有關數據分佈的一些信息。 –

0

A)改變語法使用適當的聯接:

select * 
from dept 
join emp on emp.deptno = dept.deptno 
where dept.deptno = :X; 

B)定義上dept.deptno的索引,因爲這是主過濾器(where子句)

CREATE INDEX DEPT_DEPTNO_IDX ON DEPT(DEPTNO); 

即應該讓它飛翔。

+0

DEPTNO實際上是部門表的主鍵。我猜如果該字段是主鍵Oracle本身保持該字段上的索引? – dpsdce

+0

只是爲了澄清:答案的(A)部分與性能問題沒有關係,它純粹是一種整潔的編碼風格 –