我一直在學習Oracle SQL中的索引,並且我想用測試表進行一個小實驗,以查看索引是如何工作的。正如我在此處發佈的一篇文章中發現的,最好的方法是使用EXPLAIN PLAN。但是,我遇到了讓我困惑的事情。索引,EXPLAIN PLAN和Oracle SQL中的記錄訪問
我的示例表包含屬性(EmpID,Fname,Lname,Occupation,....等)。我使用我寫的java程序(隨機名稱,職業等)填充了500,000條記錄。現在,這裏有一些示例查詢使用和不使用索引:
NO INDEX:
SELECT Fname FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
EXPLAIN PLAN說:
OPERATION OPTIMIZER COST
TABLE ACCESS(FULL) TEST.EMPLOYEE ANALYZED 1169
現在我創建索引:
CREATE INDEX occupation_idx
ON EMPLOYEE (Occupation);
WITH INDEX「occupation_idx」:
SELECT Fname FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
EXPLAIN PLAN說:
OPERATION OPTIMIZER COST
TABLE ACCESS(FULL) TEST.EMPLOYEE ANALYZED 1169
所以...成本還是一樣,1169?我現在試試這個:
WITH INDEX 「occupation_idx」:
SELECT Occupation FROM EMPLOYEE WHERE Occupation = 'DOCTOR';
EXPLAIN PLAN說:
OPERATION OPTIMIZER COST
INDEX(RANGE SCAN) TEST.OCCUPATION_IDX ANALYZED 67
所以,看來當該列是唯一一個索引只使用我從中拉取價值。但我認爲索引的要點是使用索引列作爲關鍵字解鎖整個記錄?上面的搜索是一個毫無意義的搜索...它搜索你已經知道的值。我能想到的唯一有價值的查詢只涉及索引列的值(而不是記錄的其餘部分),它將是諸如COUNT之類的集合。
我錯過了什麼?
有趣的問題,我會好奇,看看爲什麼會發生這種情況。 – ChandlerPelhams
是爲EMPLOYEE表定義的主鍵嗎? –
索引是否可能尚未完成?如果您重新運行查詢SELECT FNAME FROM EMPLOYEE WHERE Occupation ='DOCTOR';它的成本下降了嗎? – xQbert