我一直在学习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