当前位置:  数据库>oracle

Oracle 索引简单总结

    来源: 互联网  发布时间:2017-05-30

    本文导语: 建立索引时先进行排序,逻辑上分为Root(根块),Branch(茎块),leaf(叶子块)。leaf中存在索引列的值、长度、和所在rowid,茎块存了指向具体茎块的指针,root块同理。这是逻辑上的划分实际上根据表中数据量的多少可能会存在多层,...

建立索引时先进行排序,逻辑上分为Root(根块),Branch(茎块),leaf(叶子块)。leaf中存在索引列的值、长度、和所在rowid,茎块存了指向具体茎块的指针,root块同理。这是逻辑上的划分实际上根据表中数据量的多少可能会存在多层,但是索引整体上层次较低,例如一张500G的表数据量达到几百亿条,这时候它的索引只有6层。

在查询结果返回多的情况下使用索引会浪费更多的代价,另外如果一张表有五个字段,我们在三个字段上建上btree索引。那样效率只会更低。可考虑使用位图索引

索引的三大特点:
1.索引数的高度一般较低
2.索引由索引列存储的值及rowid组成
 索引SELECT * FROM T WHERE ID = 1会导致索引回表的产生,若不需要看全部数据可用SELECT ID FROM T WHERE ID= 1或可建多列的复核索引,但是复核索引最好不要超过3列的复核。在更新操作不频繁的情况下可考虑使用索引组织表
3.索引本身是有序的
 减少ORDER BY、DISTINCT排序所浪费的COST
聚合因子:
建立索引的列的顺序与索引自动排序的列的顺序的不对应度被称为聚合因子,聚合因子越大索引回表读越浪费时间(索引回表读不可避免的情况下)
Oracle 执行计划分类:
1、TABLE ACCESS FULL  全表扫描
2、INDEX FAST FULL SCAN  索引快速扫描  (不考虑排序COUNT(ID), SUM(ID), AVG(ID),列必须非空或IS NOT NULL)
3、INDEX FULL SCAN  索引全扫  (SELECT ID FROM T WHERE ID = 120)
4、INDEX FULL SCAN(MIN/MAX)  最大值最小值索引全扫  (SELECT MAX(ID) FROM T)
5、TABLE ACCESS BY INDEX ROWID  索引回表读  (SELECT * FROM T WHERE ID = 1)
6、INDEX RANGE SCAN  索引范围扫描  (SELECT * FROM T WHERE ID < 100)
7、BITMAP INDEX FAST FULL SCAN  位图索引快速扫描  (不考虑排序COUNT(ID), SUM(ID), AVG(ID),位图快速索引扫描速度非常快将近是普通索引的百倍.列不必非空)
 
btree索引优化简介
T表  字段:OBJECT_ID, OBJECT_NAME
单列索引:
CREATE INDEX IDX1_OBJECT_ID ON T(OBJECT_ID);
COUNT(*)、SUM、AVG优化:
改为COUNT(OBJECT_ID)查询,但是必须保证OBJECT_ID列非空。可用如下方法告知oracle可走IDX1_OBJECT_ID索引:
1、SELECT COUNT(OBJECT_ID) FROM T WHERE OBJECT_ID IS NOT NULL;
2、设置字段非空
MAX/MIN优化:
根据第三个特性有序排列,所以MAX/MIN的查询代价会非常小。
SELECT MAX(OBJECT_ID) FROM T; 不需加上IS NOT NULL; 使用执行计划:INDEX FULL SCAN(MIN/MAX);
ORDER BY、DISTINCT排序优化:
SELECT * FROM T WHERE OBJECT_ID < 100 ORDER BY OBJECT_ID;
未建立索引的情况下会进行排序产生TEMPSPC;
建立索引的情况下不需要产生排序 会使用IDX1_OBJECT_ID索引
 
 
位图索引
创建语法:
CREATE BITMAP INDEX IDX_BITM_T_STATUS ON T(STATUS);
适用在更新非常少的表,建立在重复度较高的列(性别)
存储结构:
位图索引存储的是比特位值
 
 
 
函数索引:
CREATE TABLE T AS SELECT * FROM DBA_OBJECT;
CREATE INDEX IDX_OBJECT_ID ON T(OBJECT_ID);
CREATE INDEX IDX_OBJECT_NAME ON T(OBJECT_NAME);
CREATE INDEX IDX_CREATED ON T(CREATED);
SELECT * FROM T WHERE UPPER(OBJECT_NAME) = 'T';
普通的BTREE索引,如果在对列做运算的条件下是无法使用索引查询的,会使用TABLE ACCESS FULL;
创建语句:
CREATE INDEX IDX_UPPER_OBJ_NAME ON(UPPER(OBJECT_NAME));
SELECT INDEX_NAME, INDEX_TYPE FROM USER_INDEXES WHERE TABLE_NAME = 'T';
函数索引的TYPE是:FUNCTION-BASED NORMAL;
函数索引的cost比全表扫描要小,但是比普通的索引要大的多。
SELECT * FROM T WHERE OBJECT_ID - 10= TO_DATE('2012-10-02', 'YYYY-MM-DD') AND TRUNC(CREATED) = TO_DATE('2012-10-02', 'YYYY-MM-DD') AND CREATED < TO_DATE('2012-10-03','YYYY-MM-DD')+1;

相关阅读:

由Oracle索引来理解ArcSDE索引

Oracle索引技术之如何建立最佳索引

Oracle索引列NULL值引发执行计划该表的测试示例

Oracle索引 主键影响查询速度

Oracle索引扫描


    
 
 

您可能感兴趣的文章:

  • Oracle与Mysql主键、索引及分页的区别小结
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • oracle10g全文索引自动同步语句使用方法
  • Oracle建立二进制文件索引的方法
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • 用Oracle 9i全索引扫描快速访问数据
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  • 在Oracle中监控和跟踪索引使用情况
  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .
  • Oracle中检查是否需要重构索引的sql
  • 轻松取得Oracle 9i建表和索引DDL语句
  • 深度揭露Oracle索引使用中的限制
  • Oracle索引(B*tree与Bitmap)的学习总结
  • oracle 索引不能使用深入解析
  • SQL Server和Oracle数据库索引介绍
  • Oracle认证:学好Oracle的六条总结
  • oracle服务启动与停止经验总结
  • Linux下Oracle常见安装错误总结及参考案例
  • Oracle中三种表连接算法的总结
  • Oracle、DB2、PostgreSQL之Sequence大总结
  • [Oracle] dbms_metadata.get_ddl 的使用方法总结
  • Oracle数据库中的字符处理技巧总结
  • Oracle数据字典的学习总结
  • Oracle 数据库优化实战心得总结
  • 深入ORACLE迁移到MYSQL的总结分析
  • oracle数据库sql的优化总结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • NOSQL iis7站长之家
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,