2012-11-28 25 views
0

SQL> desc emp_1;加入非索引列

Name  Type   Nullable Default Comments 
-------- ------------ -------- ------- -------- 
EMP_ID NUMBER         
EMP_NAME VARCHAR2(20) Y       
DEPTNO NUMBER(10) Y 

SQL>遞減部門

Name  Type   Nullable Default Comments 
--------- ------------ -------- ------- -------- 
DEPT_ID NUMBER  Y       
DEPT_NAME VARCHAR2(20) Y 

SQL> CREATE INDEX abc_idex ON emp_1(DEPTNO);

Index created 

選擇/ * +指數(emp_1 abc_idex)* /從emp_1 EMP_NAME INNER JOIN部門ON emp_1.deptno = dept.dept_id

Explain Plan :- 
SELECT STATEMENT, GOAL = ALL_ROWS   271 100000 800000 
MERGE JOIN   271 100000 800000 
    TABLE ACCESS BY INDEX ROWID EXAMINBI EMP_1 267 100000 500000 
    INDEX FULL SCAN EXAMINBI ABC_IDEX 131 100000 
    SORT JOIN   4 4 12 
    TABLE ACCESS FULL EXAMINBI DEPT 3 4 12 

選擇/ * +指數(emp_1 abc_idex)*/EMP_NAME從emp_1 INNER JOIN部門ON emp_1.deptno = dept.dept_id 和emp_1.emp_name = dept.dept_name

Explain Plan:- 
SELECT STATEMENT, GOAL = ALL_ROWS   272 1 11 
HASH JOIN   272 1 11 
    TABLE ACCESS FULL EXAMINBI DEPT 3 4 24 
    TABLE ACCESS BY INDEX ROWID EXAMINBI EMP_1 267 100000 500000 
    INDEX FULL SCAN EXAMINBI ABC_IDEX 131 100000 

我米清除我的索引CON除了你的幫助。我的理解是甲骨文會跳過我的索引提示,因爲它需要其他列也沒有索引(emp_name)但仍emp_1表索引在第二種情況下掃描。我的問題會幫助在這種情況下,我在哪裏使用另一列連接索引不使用(在我們的例子emp_name)?我們應該在這種情況下使用索引提示嗎? *注意: - 我知道這是emp_name和dept_name不是邏輯連接,但僅用於測試目的,我創建了相同的。*

回答

0

在您的情況下使用索引可能會減慢整個語句。這是因爲您正在查詢整個表格DEPT和EMP_1。由於提示,Oracle必須查詢完整的表和索引。你真的想要這個嗎?

在這樣的簡單情況下,我不會使用提示。優化器的工作相當不錯。

如果您使用的語句爲特定部門,那麼結果將是更好

select emp_name 
    from emp_1 INNER JOIN dept ON emp_1.deptno = dept.dept_id 
    where dept.dname = 'any department' 
+0

我只是瞭解索引而不是項目或任何東西,只是爲了我的理解目的。我想知道它是否建議在聯接時使用索引提示,您使用的是同一個表中的非索引列。它會有幫助嗎?此外,我的理解是在我的第二個查詢中,它將是全表掃描,並會跳過我的提示。但是,如果您注意到解釋計劃,emp_1表只能通過索引訪問,而cants可以查看有關全表掃描的任何內容。我在解釋計劃中錯過了些什麼? –

+0

在第二個查詢中,通過完整掃描的提示掃描您的索引。這意味着Oracle從索引中選擇所有記錄。索引是存儲rowid的二叉樹結構。對於每個查詢的rowid,都從表EMP_1中選擇單個行。全索引掃描意味着查詢所有記錄,這意味着所有的錶行也被查詢。 –

0

等:

select /*+ cardinality(0)*/ emp_name 
from emp_1 
    INNER JOIN dept ON emp_1.deptno = dept.dept_id 
1

我想知道,如果它的recommened在何時使用索引提示加入你 正在使用同一張表中的非索引列。它會有幫助嗎?

沒有

在正常情況下,你根本就沒有使用提示大多數情況下。正如你在這裏看到的那樣,你已經使用了一個提示,Oracle已經跟着它做了一些愚蠢的事情。您只能在非常有限的情況下使用提示,通常只有當您知道Oracle無法解決的數據性質時才提示。通常,我使用的唯一提示是基數提示,因爲Oracle有時可能確實無法正確計算基數。

不要以爲你需要經常使用提示。你沒有。即使現在有提示,但數據的性質發生變化時,它可能會停止工作。