索引访问的概念

时间:2012-03-06 16:36:37

标签: sql oracle11g

  

我是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'
  

然后它将取出对应于索引值5的rowid并从emp表中获取对应于5 empno的行

     

现在我的疑问是,这里是从index_table获取的,但是为了找到rowid,它也扫描整个表(index_table)直到5,并且同样使用rowid来查找行,那么它与表的不同之处没有索引?,我们也扫描整个表直到5 empno。

     

唯一的优点是索引按升序存储。

     

我知道我错了,但有人可以解释一下

**Doubt**
  

是否进行全表扫描,扫描每一行列,而不管其过滤条件如何?   让我采取上面使用的查询,如果该表上没有主键,那么它将进行全表扫描,然后对于empno = 5,它会扫描每一行empno值还是它将扫描empname,salary还是mrgid?

3 个答案:

答案 0 :(得分:3)

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

非常广义术语中,您可以将索引与电话簿进行比较。如果你想在 Georgetown (empno = 5)中找到 Frank Miller 的电话号码( rowid ),你可以拿电话簿找到 Georgetown 的条目。您不必阅读整本电话簿,因为您知道城镇已订购。所以你打开中间的电话簿,发现这个城市是蒙大拿城。由于蒙大拿城在乔治城之后,你打开当前开幕式和开头之间的电话簿。有了这种策略,你就会继续,直到找到乔治城。然后你用姓氏和名字做同样的事情。

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

例如,您可能希望阅读b-tree以获取更多信息 on tahiti

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

在电话簿类比中,这将是一个查询,例如查找地址为22 Elm Street 的所有电话号码。由于电话簿不是按街道名称或门牌号码订购的,因此您必须阅读每个条目才能找到相应的电话号码。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

Oracle(以及其他RDBMS)中的“普通”索引是B-tree结构。而且,如果只有Oracle product documentation提到了那个!