我是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?
答案 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提到了那个!