索引:建立在表的一列或多列的辅助对象,它有助于快速访问该表中的数据。由于其内在结构,索引具有某些内在的开销,
这些开销依赖于为检索由索引中ROWID指定的行所访问的表中的块数,此开销可能超过进行顺序全表扫描的成本。Oracle
存储一个索引的数据结构是B*树。
怎样建立最佳索引
一些具有吸引力的索引:
1、非唯一索引
2、唯一索引
3、位图索引
4、局部有前缀分区索引
5、局部无前缀分区索引
6、全局有前缀分区索引
7、散列分区索引
8、组合分区索引
9、反向键索引
10、基于函数的索引
11、降序索引
12、索引编排表
13、以上列表的一个或多个组合
1)建立索引需要回答的问题
1、与全表扫描相比,索引扫描需要执行多少块I/O操作?
回答 如果知道此问题答案,就会知道建立和使用索引是否具有性能意义。
2、用于特定表数据访问的常用列组合是什么?
回答 查看应用程序,查看V$SQLAREA或V$SQLTEXT,分析最常用SQL语句。查找V$SQLAREA中执行较高次数的语句,并查找Where子句的成分
3、对打算在其上建立索引的一组给定的列,其选择性是什么?
回答 如果一些列始终有值并相对唯一,则它们应该是索引的前导列,为建立索引,按照可能是具有唯一值的概率,对这些列进行降序排列。
4、Where子句中的所有列都需要索引吗?
回答 不需要,如果列具有很低的数据基数,并且或者具有空值,需要有意识的从索引列表中去除这样的列。索引中有这样的列不会给查询带来任何好处。
5、索引所基于的表是用于事务处理还是主要用于查询?
回答 如果是事务处理的表,需要确定由于给出附加索引对事务处理潜在的负面影响。如果主要用于查询,则最好建立索引,大需要了解INDX表空间中与空间有关的问题。
6、如果更新表中数据,应该是在批处理(一个用户和一个大的更新操作)中完成还是事务性的完成(多个用户和多个小的更新操作)?
回答 应该知道,不知道,请花时间查一下。这将有助于确定何时删除索引或何时使其无效。
7、需要为批处理删除索引、保留索引or使其无效?
8、建立新索引的存储含义是什么(分区数、表空间大小、使用的空间)?
回答 为新索引做存储计划,记住较大的存储量、容量及存储预算
9、对应用程序来说,索引的停工期含义是什么?
回答 如果分区表上配置了一个全局有前缀的索引,如果该表需要频繁的联机分区管理,则该索引在整个分区操作维护和重建整个全局索引
的时间段内是不能用的,这个时间段就是所谓的停工期。
2)单列索引和组合索引
如果应用程序中经常使用col1、col2、col3,则建立组合索引,比建立三个单列索引更好。以下索引还能满足在Where子句中使用col1的SQL
的需要:
create index inex1 on table1
(col1,col2,col3) tablespace indx;
3)基于函数的索引
create index index1 on table1
(upper(col1), col2, col3) tablespace indx;
还可用使用PL/SQL函数建立基于函数的索引,例如
create index line_item_calc_profit on 1000的line_items
(calc_profit(item_id, item_cost, sticker_price))
tablespace indx;
一下是查询基于line_item_calc_profit函数的索引确定利润超过$1000的line_items;
select ord_id, item_id, item_cost, sticker_price
from line_items where calc_profit(item_id, item_cost, sticker_price) > 1000;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/518171/viewspace-668429/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/518171/viewspace-668429/