版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1428744
背景:
按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。
本文主题:第三章《Indexes and Index-Organized Tables》 - Overview of Indexes。
这章讨论的是索引和索引组织表相关的知识,索引是一种能提高表行数据访问速度的对象,索引组织表是一个以索引结构存储数据的表。
这章包含的内容:
索引概要
索引是一种可选的结构,他和表或者表簇相关联,能提高数据访问的速度。通过创建一张表中某一列或者多列的索引,你就有能力快速提取随机分布在表中的一个小数据集。索引是降低磁盘IO的方法之一。
如果一张堆表没索引,那么数据库就必须执行一次全表扫描来检索某个值。例如,没建索引,在hr.departments表定位location是27的值就需要数据库扫描每一个表块。随着数据量的增加,这种方法不会有很好的扩展性。
打一个比方,假设一个HR经理有个卡片箱的柜子。包含雇员信息的文件夹会随机插入箱子中。雇员Whalen(ID是200)的文件夹是放在从底往上数第10个文件夹中,而King(ID是100)的文件夹是放在第三个箱子中。为了定位文件夹,经理会从1号箱子开始浏览每个文件夹,直到文件被找到。为了提高访问的速度,经理能创建个顺序存储每个雇员ID和他对应文件夹位置的索引。
相类似,经理可以创建雇员姓氏、部门ID等这些字段的独立索引。
总的来说,在下面这些情况可以考虑创建索引:
可以参考:第五章,“数据一致性”。
索引的特征
索引是一种逻辑上和物理上均和关联的表对象独立的对象。因此,删除或者创建索引,并不会在物理上影响索引所在的表。
注意:
如果删除索引,应用则会变慢。然而,之前通过索引对数据的访问会变得更慢。
索引存在与否不需要任何SQL语句层面的改动。索引是一种快速访问单行数据的方法。他只会影响执行的速度。假设一个数值已经被索引,索引就会直接指向包含这个数值的行物理位置。
在创建索引后,数据库会自动管理和使用索引。数据库还会自动影响数据的改变,例如增加、更新和删除所有和索引关联的行,不需要用户执行任何操作。尽管会插入新行,索引数据的提取性能总会是一致的。但是,表中存在多条索引会降低DML的性能,因为数据库必须更新这些索引。
索引存在以下的属性:
索引可以是usable(默认)或者unusable。一个unusable不可用索引在执行DML期间不会被维护,并且被优化器所忽略。unusable不可用索引能提高批量加载的性能。为了不删除或重建索引,你可以将索引置为unusable,然后重建。unusable不可用索引和索引分区不会消耗空间。当你讲一个usable索引置为unusable,数据库会删除对应的索引段。
索引可以是visible(默认)或者invisible。一个invisible不可见索引在DML执行期间会被维护,但是默认不会被优化器使用。将索引置为invisible是让索引unusable或者删除索引的替代方案。invisible索引在删除索引前的测试,或者在不影响整体应用的情况下临时使用索引的场景,非常有用。
可以参考:
“优化器概要”。
《Oracle Database 2 Day DBA》和《Oracle Database Administrator's Guide》了解如何管理索引。
《Oracle Database Performance Tuning Guide》了解如何优化索引。