2012-03-06 62 views
0

对于Oracle来说,我是一个非常新的探索事物,阅读索引访问的方式,我得出一个结论,假设我有一个表emp。索引访问的概念

table emp 
--------------------------- 
empno ename salary mgrid 
--------------------------- 
1 ab 200 2 
2 bn 900 3 
3 bh 900 1 
4 ah 890 4 
5 kk 67 0 
6 ac 9090  

这该是多么的主键EMPNO唯一索引创建

index table(suppose) 
-------------------- 
rowid index value 
--------------------- 
xyzz  1 
-   2 
-   3 
-   4 
-   5 
-   6 

其中 ' - ' 号填列一些十六进制值,假设我写一个查询,

select * from emp where empno ='5' 

那么它将取出的rowid对应的索引值5和读取该行对应于5 EMPNO从表emp

现在我的疑问是,在这里它是从index_table取,但要找到的rowid是也扫描整个表(index_table)到5,同样使用rowid来查找行,那么它与没有索引的表有什么不同呢?还有,我们正在扫描整个表直到5个empno。

唯一的好处是索引是按升序存储的。

我知道我错了,但有人可以解释这个

**Doubt** 

执行全表扫描,扫描每行柱不论它过滤条件? 让我们接受上面使用的查询,如果该表emp上没有主键,那么它将执行全表扫描,然后对于empno = 5,它会扫描每一行empno值还是会扫描empname,薪水和mrgid也?

回答

3

Oracle(或任何其他数据库)是而不是在您发布的示例中扫描整个索引。这就是堆表和索引之间的区别。

非常广义而言,您可以将索引与电话簿进行比较。如果你想找到的电话号码在(在的rowid弗兰克·米勒的乔治敦(EMPNO = 5)你把电话本,找到条目乔治敦。您不必阅读整个电话簿,因为您知道城镇已经订购。所以你打开中间的电话簿,发现小镇是蒙大拿市。由于蒙大拿州城在乔治城之后,您在当前开放和开始之间打开电话簿。采用这种策略,直到找到乔治城。然后你用姓氏和名字做同样的事情。

同样,这是有效的,因为城镇,姓氏和名字按字母顺序排列。在数据库中,这是通过b-trees确保的。

你可能想获得更多资料,B树读了,例如 on tahiti

编辑:你还问,如果数据库必须扫描整个表,如果没有主键。答案是:是的,它必须,如果也没有empno上的索引。

在电话簿中比喻,这将是一个像这样的查询查找所有电话号码的地址是22 Elm Street。由于电话簿不是按街道名称或门牌号码排序的,您必须阅读每个条目才能找到相应的电话号码。

+0

谢谢雷内的精彩解释,但你能否清除上面提到的问题中提到的另外一个疑问,我最近更新了 – 2012-03-06 16:56:05

0

对于索引表,不仅可以在主键上使用它。对于其他任何列,数据可能不会很好地排序,比如您提供的示例中的“薪水”。

在这种情况下,使用索引表会很有用,特别是当您有数千个条目时。

+0

有一个问题,全表扫描,扫描具有特定列值的行,或者它将扫描整行的列值,而不管我们使用的是什么过滤器,假设我已经写了一个查询select * from emp where empno = 3,here它会扫描一个特定的行,只有empno或所有列像ename,salary,mgrid? – 2012-03-06 16:45:54

+0

:我只想知道我的概念有什么问题? – 2012-03-06 16:48:44

+0

我不是100%确定的,但我会假设会参考您正在过滤的值的索引表。 – jsimpson 2012-03-06 16:51:53