背景:
按照《Oracle Conecpt》的结构一起了解Oracle数据库,这是学习Oracle从入门到精通的基础。
前言《Introduction to Oracle Database》的历史文章:
第二章《Tables and Table Clusters》 历史文章:
《《Oracle Concept》第二章 - 21 (12c内容补充)》
《《Oracle Concept》第二章 - 20 (12c内容补充)》
第三章《Indexes and Index-Organized Tables》历史文章:
本文主题:第三章《Indexes and Index-Organized Tables》 - Overview of Indexes。
键和列
键是一组能让你创建索引的列或者表达式的集合。尽管索引和键值经常互换使用,但他们二者,还是有些区别的。索引是存储在数据库中的结构,用户用SQL语句就能管理他们。而键值严格意义上讲是一个逻辑概念。
接下来的语句会在示例表oe.orders的customer_id列创建个索引:
CREATE INDEX ord_customer_ix ON orders (customer_id);INDEX ord_customer_ix ON orders (customer_id);
上面语句中,customer_id列是索引键值。索引的名称,叫做ord_customer_ix。
注意:
主键和唯一键会自动创建索引,但是你可能需要为外键手动创建索引。
P.S.
对于外键为何需要创建索引,可以参考《探究外键为何要建索引?》和《外键为何要建索引?》。
参考:
《Oracle Database SQL Language Reference》了解CREATE INDEX的语法和语义。
复合索引
复合索引,也叫组合索引,他是一个基于表中多列的索引。复合索引中的列应该按顺序出现在检索条件中,才能最大化检索表中不相邻行的数据。
复合索引能提高WHERE条件引用了复合索引中所有列或者前导部分列的SELECT语句的检索速度。因此复合索引中列的顺序就很重要了。通常,经常用到的列应该放在复合索引的前面。
例如,假设应用经常检索employees表的last_name,job_id和salary列。而且假设last_name列的cardinality集势很高,意味着相比表的数据量,他的唯一值的数量很高。你能按照下面的列顺序创建索引:
CREATE INDEX employees_ix ON employees (last_name, job_id, salary);INDEX employees_ix
ON employees (last_name, job_id, salary);
访问所有这三列,或者仅访问last_name列,或者仅访问last_name和job_id列,都能用上这索引。在示例中,不访问last_name列的检索,不会用到索引。
注意:
在一些场景中,例如当前导列的cardinality值很低,数据库可能会选择索引跳跃扫描(参考“Index Skip Scan”)。
如果每个索引中列的排序不同,同一张表就能存在多个索引。如果你指定了唯一不同的列排序,就能用同一列创建不同的索引。例如,接下来的SQL语句指定了有效的排列:
CREATE INDEX employee_idx1 ON employees (last_name, job_id);CREATE INDEX employee_idx2 ON employees (job_id, last_name);INDEX employee_idx1 ON employees (last_name, job_id);
CREATE INDEX employee_idx2 ON employees (job_id, last_name);
参考:
《Oracle Database Performance Tuning Guide》了解复合索引的更多信息。