考慮EMP,DEPT示例 在deptno的上下文中查詢EMP表是非常常見的。如果您經常 查詢:在連接查詢中沒有選擇外鍵索引
select * from dept, emp
where emp.deptno = dept.deptno and dept.deptno = :X;
我有一個指數deptNo_idx員工的桌子。但是每當我看到執行計劃時,這個索引就不會被使用。甚至給索引暗示沒有用
任何想法如何在外鍵列上使用索引?
考慮EMP,DEPT示例 在deptno的上下文中查詢EMP表是非常常見的。如果您經常 查詢:在連接查詢中沒有選擇外鍵索引
select * from dept, emp
where emp.deptno = dept.deptno and dept.deptno = :X;
我有一個指數deptNo_idx員工的桌子。但是每當我看到執行計劃時,這個索引就不會被使用。甚至給索引暗示沒有用
任何想法如何在外鍵列上使用索引?
當您試圖理解優化器行爲時,EMP
和DEPT
表不是特別好用的表。它們非常小,優化器會經常正確地確定全表掃描比索引訪問更有效。此外,值相對較少,因此優化器知道它將不得不從EMP
表中獲取相對較大比例的行。由於表中的行數很少,並且您需要爲任何給定的值獲取大部分行,所以表掃描將更有效。
如果表格較大並且有更多的部門,優化器將更有可能確定使用索引會更有效。
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);
即應該讓它飛翔。
DEPTNO實際上是部門表的主鍵。我猜如果該字段是主鍵Oracle本身保持該字段上的索引? – dpsdce
只是爲了澄清:答案的(A)部分與性能問題沒有關係,它純粹是一種整潔的編碼風格 –
實際上我只是用這些表格來清楚地表達問題。在索引性能有效的情況下,實際表格會很大 – dpsdce
@Dhirendra - 如果使用不同表格存在特定問題,請發佈表格定義,查詢計劃,查詢以及有關數據分佈的一些信息。 –