如果在一张表(表的记录非常大)中我要给一个字段加索引,这个字段是什么类型的比较好,索引的效率高?
谢谢:)
谢谢:)
解决方案 »
- 求助 PLS-00103 错误!! 大虾帮忙
- 上千万条数据,oracle索引失效怎么处理
- 求高手:什么情况下会发生隐式commit和隐式rollback
- 建了一张时间表time,有年、年描述、月、月描述、日、日描述等,怎么将系统时间初始化进去,比如说20100101到20121231这段时间,用pl/sql实现。
- ORACLE鎖定機制
- ORACLE9i 建表问题
- 恢复报错! 急 急
- 在问oracle 服务启动问题,麻烦大家解决一下
- 在一个更新触发器中,如何知道那些列被更新了?在sqlserver中可以采用update(column),不知道在oracle中如何解决?
- 我想把一个oracle的查询转成mysql的,不知道这里有没有高手帮我实现一下。搞定了,把这边和那边(myssql论坛)的共200分都给你
- PLSqlDev 登录oracle出现:ORA-12514 监听程序当前无法识别连接!跪求高手帮忙
- plsql执行自定义函数问题
index效率最好,简单的说作为索引字段是越短越好
理论上是这样,但是OLTP系统还是不要加位图索引,并发性太差了
新建oracle QQ 群
群号:54775466
欢迎爱好者积极者 入群一起探讨。
是的,支持这种说法。并且索引并非随便加,你要用来干什么?根据实际业务而定,而不是根据技术决定的,如你要提取一个表的整体数据,那索引对你几乎没有意义,普通索引只能帮助你在大量数据中寻找少量数据较为快速,而并非绝对,对于索引段的管理需要系统格外的开销,有些开销比表的维护还要大,因为他的物理存储方式和表几乎一样,都是将索引字段存储到块内部的,遍历到指定的ROWID,若只需要索引字段直接返回结果,若需要其它字段根据ROWID回表提取数据返回。所有索引寻找都给予平衡二叉树,至于唯一性索引是基于该树只能寻找到一个ROWID而已,往往走INDEX UNION SCAN,范围查询是,需要定位多行数据,若多行数据的ROWID在同一个索引块内部是最好的,不用跨块提取ROWID,如果相邻的范围查询,由于所以对所以指向的字段进行排序,所以提取的也是相邻节点的ROWID,其与唯一性索引的区别在这里,提取的方式往往是INDEX RANGE SCAN,而若你查询的结点分布比较分散(如ID IN(1,110000,200000),这样的数据是很分散的,另外大量的数据进行返回时),索引节点导致多次从根节点重新搜索,那么结果一般会导致INDEX FULL SCAN,此时存在和TABLE FULL SCAN的竞争,一般不需要回表查询,ORACLE才会选择INDEX FULL SCAN,因为这样的情况下,两者的效率不一定谁比谁快;另外是INDEX FAST FULL SCAN,一般是在统计的时候使用,如SELECT COUNT(*) FROM TABLE_NAME;或者在两个表通过索引字段关联过程中,若只返回索引值(无回表),带有非唯一性索引的那个表会采用这种索引方式,在OLTP系统中我们不推荐使用位图索引,他在高并发时应用中容易出问题,但位图索引可以在OLAP系统中的统计角度解决部分问题。而Index Skip一般是联合索引中采用联合索引非主字段取查询数据,而是直接通过辅助字段取查询采用的索引方式,该索引方式的效率也蛮低的;最后所谓函数索引,也可以对某表部分数据进行索引,并不是和数据类型有什么关系,容易误解的是某些数据类型经常容易被加函数来对比,如:日期类型字段,很多参数在传入是字符串,很多人习惯写法是:
TO_CHAR(日期字段,'YYYY-MM-DD HH24:MI:SS')=传入参数
这样当然不会走索引,我们的写法是:
日期字段=TO_DATE(传入参数,'YYYY-MM-DD HH24:MI:SS')
走不走索引,你自己试一试就知道了,自己使用PL/SQL分析器或者可以将SQL执行计划和分析过程导出查看,或者在COMMONDE中使用:
SET AUTOTRACE TRACEONLY;命令后再执行SQL,此时就是输出SQL的执行计划;
我们查询过程一般情况下没有必要将数据库字段转换后再对比的,不想让数据库字段加一个函数再做对比,而是将参数加函数,那样就和函数索引没有关系了,也会走索引了,但是有些时候我们逼于无奈,要通过转换后去和某些值做对比,此时,而且需要经常使用部分数据,此时就要用到函数索引了。