oracle:索引

数据库索引用来在表中查找特定的行。

使用索引的一个负面影响:向表中添加新行时,必须花费额外的时间来更新该行的索引。

一个基本原则:当任何单个查询要检索的行少于或等于整个表行数的10%时,索引就非常有用。

索引的候选列应该是用来存储很大范围的值的列。这些索引类型被称为“B-树”索引

好的索引候选列是那些对每个记录只包含一个唯一数字的列;差的索引候选列是那些只包含很小范围的数字代码。

Oracle数据库会为表的主键以及包含在唯一约束中的列自动创建B-树索引。对于包含小范围值的列,可以使用位图索引。

创建B-树索引: CREATE INDEX可以用来创建B-树索引

CREATE [UNIQUE] INDEX index_name ON

table_name ( column_name[,column_name ...])

TABLESPACE tab_space;

由于性能方面的原因,通常应该将索引与表存储到不同的表空间中。在产品数据库中,数据库管理员应该为表和索引创建不同的表空间。

CREATE UNIQUE INDEX i_customer_phone ON customers(phone);

CREATE INDEX i_employees_first_last_name ON employees(first_name,last_name);

创建基于函数的索引:如果想让索引可以基于函数的结果使用,就必须创建基于函数的索引。

CREATE INDEX i_func_customers_last_name ON customers(UPPER(last_name));

为了利用基于函数的索引,DBA必须将初始化参数QUERY_REWRITE_ENABLED设置为true。ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;

获取有关索引的信息:从user_indexes(all_indexes)视图中可以获得有关索引的信息。

SELECT index_name,table_name,uniqueness,status FROM user_indexes;

获取列索引的信息:通过user_ind_columns视图可以获得列索引的信息。

SELECT index_name,table_name,column_name FROM user_ind_columns;

修改索引

ALTER INDEX可以用来修改索引。

ALTER INDEX i_customers_phone RENAME TO i_customers_phone_number;

删除索引

DROP INDEX i_customers_phone_number;

创建位图索引:位图索引一般用于数据仓库中,数据仓库是包含大量数据的数据库。数据仓库中的数据一般使用很多查询来读取,但数据并不被很多并发事务所修改。

位图索引的候选列是在很多查询中被引用但只包含小范围值的列。

索引一般包含一个指向表行的指针,表行包括一个给定的索引键值。键值用来获取表行的rowid(行的物理位置)。在B-树索引中,对每个键存储一个rowid列表,与具有此键值的行相对应。在B-树索引中,数据库存储一个键值列表,其中包含每个rowid,这样数据库就能够定位表中实际的行。

在位图索引中,位图用于每个键值,位图使数据库能够定位一行。位图中的每一比特位对应于一个可能的rowid。如果比特位被设置,那么就意味着具有相应rowid的行包含此键值。映射函数将比特位置转换为实际的rowid。

位图索引一般用在包含大量数据且内容不常修改的表中。而且位图索引只应该在包含少量不同值的列上创建。

如果某列的不同值数量少于表中行数的1%,或者如果某列的值的重复次数多于一百次,那么此列就是位图索引的候选列。

例:CREATE BITMAP INDEX i_order_status ON order_status(status);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章