1)与全表扫描相比,索引扫描需要执行多少块I/O操作?
回答如果知道此问题的答案,就会立即知道建立和使用一个索引是否有性能意义,
2)用于特定表中的数据访问的最常用的列组合是什么?
回答 研究应用程序代码。如果程序代码不客易看懂,则查看V$SQLAREA或
V$SQLTEXT,并分析最常用的sQL语勾。查找在V$SQLAREA中具有较高执行次数的语
勾,并查找它们的where子句的成分。
3)对打算在其上建立索引的一组给定的列,其选择性是什么?
回答如果一些列始终有值并且相对惟一,则它们应该是索引的前导列。为建立索引,按
照可能具有惟一值的概率,对这些列进行降序排列。
4)在where子句中引用的所有列都需要进行索引吗?
回答 不需要,如果列具有很低的数据基数,并又或者可具有空值的话。需要有意识他从
索引列表中去除这样的列。索引中有这样的列不会给查询带来任何好处。
5)索引所基于的表用于事务处理还是主要用于查询?
回答如果不知道,应该查一下!如果它是事务处理的表,则需要确定由于给出附加索引
对事务处理的潜在的负面影响。在较好的查询性能和事务处理时的负面影响之间怎样权
衡?如果它是主要用于查询的表,别最好建立索引,但是需要了解INDX表空间中的与空
间有关的问题。
6〕如果更新表中的数据,应该在批处理(一个用户和一个大的更新操作)中完成还是事务
性地完成(多个用户和多个小的更新操作)?
回答你应该知道,如果不知道,请花时间查一下。这将有助于确定何时期删除索引或何时
使其无效。
7)需要为批处理保留索引,或者需要删除它或使它无效吗?
回答你应该知道,如果不知,查一下!
8)建立新索引的存储含义是什么(分区数、表空间大小、使用的空间,等等)?
回答为新索引做存储计划,记住较大的存储量、客量规划以及存储预算。
9)对于应用程序来说,索引的停工期含义是什么?
回答 如果在一个分区表上配置了一个全局有前缀的索引,并且如果该表需要频繁的联机
分区管理,则该全局索引在分区维护操作和重建整个全局索引之间的时间段内是不能使
用的。这个时间段就是所谓的停工期。清楚了吗?
10)为了重建索引,需要有多长的停工期, (在oracle8i中不成问题,因为索引可以联机建
但对于不是使用oracle8i的那些人来说,这个问题很有讲究。)
回答 如果拥有由oracle序列提供的列的索引,通过设计,在该列和该索引中将具有单调
增加的位。所有新的值将存储在B*树的右边,并且需要定期重建这些索引以便重新平衡
B*树。能够多久做一次?每天有多少新记录插入到该表中?在回答此问题时.还会有更
多的问题。
何时需要重建索引
由于索引存储在B*树中,且索引的最终日标是提供对表中数据的快速访问,显而易见,任
何索引的查找都需要使所发生的节点/块的读取操作最少(减少I/o是索引可用性的关键)。在这
里,最有关的因素是需要访问的叶节点数据块的数量。索引中叶数据块数越少,索引使用的I/o
操作就越少,并且从表中检索数据行的速度就越快。正如已经说道的那样,应该注意,经历了
重复插入和删除操作的表的索引可能面临更高的碎片风险。
现在的问题是,在—个给定的索引中叶块是如何变成碎块的?是由于要读取并清空大量的
叶块吗?因此,确定索引的叶块密度很重要。叫缺的内容越稠密,索引越好。通过运行一个脚
本来检索索引的列中的数据行值的数量和出现在该索引中的叶块的数量是有益的。
例如,如果今天有1000行值和10个叫块.则叶块的密度等于1000/10行=100行:如果从今
天起的一周中的行数为1200,但有20个叶块,则叶块密度等于1200/20行=60行。相比之下,行
数增加20%,而叶块密度降低40%。现在应该重建该索引,因为它潜在地包含了许多空块。
SQL语句的where子句条件在使用索引的情况下访问的数据块比执行全表扫描时的多时,
不使用索引,宁可使用全表扫描。这可以通过对索引的列使用一个无害的表达式(如对于
数值列为+0,对于字符列为一个空串||''),或者通过使用FuLL提示;如果正在使用基于成
本的优化程序)暗示SQL语句来达到。