是不是表的索引建的愈多,查询就比较快。

解决方案 »

  1.   

    答案肯定是否!!!请参考:
    索引与表一样,也属于段(segment)的一种。里面存放了用户的数据,跟表一样需要占用磁盘空间。只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样。在理解索引时,可以想象一本书,其中书的内容就相当于表里的数据,而书前面的目录就相当于该表的索引。同时,通常情况下,索引所占用的磁盘空间要比表要小的多,其主要作用是为了加快对数据的搜索速度,也可以用来保证数据的唯一性。
      但是,索引作为一种可选的数据结构,你可以选择为某个表里的创建索引,也可以不创建。这是因为一旦创建了索引,就意味着oracle对表进行DML(包括INSERT、UPDATE、DELETE)时,必须处理额外的工作量(也就是对索引结构的维护)以及存储方面的开销所以创建索引时,需要考虑创建索引所带来的查询性能方面的提高,与引起的额外的开销相比,是否值得。
      

  2.   

    应该是建的合适,如果一个select * from table_a 这样的语句,你建index也是没有作用的,这时候的fts比你的index scan后在找数据开销还更少一些。index是用来提高表扫描的快速定位的。所以有这样的需要的时候,建index才有意义,比如 select * from table_a where name = 'xxxx'; 这时候很明显,需要用name来做过滤,这时的index建立在name上面,就可以直接定位到name的index上的那些值为xxxx的记录,在根据这些信息就可以快速定位到指定的结果块上了,这样比走一个全表的扫描要快的多(当然如果表过小,tfs的开销会小于index scan的).是不是这样就一定会快了,这里还要认清一个问题,就是index能不能作用的问题,还是上面的例子,如果换成
    1. select * from table_a where name like '%xxxx'
    2. select * from table_a where name like 'xxxx%'这两个是不是都会很快了,答案是,不是的, 即使你建立了name的index,但是由于1 用的是 like '%xxx' 这样的模式,index还是用不上的,这里还是会使用fts,而2. 被看是小小的差别,他却是可以用index的。当然速度就快一些了。这些知识仅是index和sql优化的最浅显的知识,由这里例子里可以看到这部分的内容是变化多段的,但是万变都不离其基本核心,就是index的作用是优化执行计划的路径的,index的执行效率并不是不变的,是受数据量和查询方式的影响的。 
      

  3.   

    通常,为了均衡查询的效率和DML的效率,我们要仔细的分析应用,找出来出现频率相对较多、字段内容较少(比如varchar2(1000)就不适合建立索引,而varchar2(10)相对来说就适合建立索引)的列,合理的建立索引,比如有时候我们希望建立复合索引,有时候我们更希望建立单键索引