ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 索引 - 基础篇

索引 - 基础篇

原创 Linux操作系统 作者:jiuniang012 时间:2009-09-08 10:08:12 0 删除 编辑
索引 - 基础篇

1. 概述
    索引是和表(tables),簇(clusters)相关联的一个可选对象, 它可以帮助提高查询数据的效率,为优化器提供更快的执行路径. 你可以不用重写SQL语句就可以通过索引来改变执行计划, 虽然查询的结果一样,但查询速度确快得多.

2. 索引的分类
  • B-tree indexes: 默认的也是最常用的

  • B-tree cluster indexes: defined specifically for cluster

  • Hash cluster indexes: defined specifically for a hash cluster

  • Global and local indexes: relate to partitioned tables and indexes

  • Reverse key indexes: most useful for Oracle Real Application Clusters applications

  • Bitmap indexes: compact; work best for columns with a small set of values

  • Function-based indexes: contain the precomputed value of a function/expression

  • Domain indexes: specific to an application or cartridge.

        索引的数据不管是在逻辑上还是物理上都和基表是独立的. 正是基于这种独立的结构它们需要存储空间. 创建和删除索引并不会影响基表,应用程序和其它索引, 只不过性能上也许会受影响. 当对基表进行插入,更新,删除操作时, 数据库自动维护索引.

3. 管理索引
     对于索引的利用必须非常小心,只有清晰的理解了索引才能最大化的利用索引来提高数据库的性能. 下面介绍下关于索引需要注意的基本问题:

     3.1 在插入数据后创建索引
            数据大多是通过SQL*Loader和import工具插入或导入表的. 在数据被插入或导入后创建索引效率更高. 如果在导入数据前创建一个或多个索引,则每插入一行数据都要相应的更新每个索引. 显然这执行效率低.
            在一个已经有数据的表上创建索引需要排序空间(sort space). 有些排序空间是来自于内存,它的大小由SORT_AREA_SIZW参数决定. 数据空同样会交换排序信息于临时段(temporary segments).

     3.2 正确选择基表和索引列
            对于初学者来说对于什么时候要创建索引是个很迷茫的问题, 以下三点也许对你有点帮助:
            1). 当经常在一个大表里查询的数据行少于15%时,可以考虑创建一个索引. 当然这个百分比也不是绝对的,它和表扫描的速度,和索引键相关联行的数据分布也有关系. 一般来说,表扫描的速度越快百分比就越低,行数据越集中百分比越高.
            2). 为了提高多个表的join性能,创建索引列用于join.
                 (主键和唯一约束自动创建索引,但也许需要为外键也创建索引)
            3). 小表一般不需要创建索引,用全表扫描效率更高. 当查询很慢的时候需要检查当初的这个小表是否变得很大的了,从而考虑是否需要建索引.

            对于什么样的列适合作为索引列,以下可供参考:
            1). 列的值相对来说是唯一的(值比较少,如性别只有男和女两种)
            2). 值的范围比较大(适合于常规索引)
            3). 值的范围比较小(适合于位图索引)
            4). 列包含很大NULL值,但经常查询的是非空值.

            以下是不适合作为索引的候选列
            1). 列包含很多NULL值并且不查询非空值.
            2). LONG, LONG RAW类型的列

            另: 虚拟列(virtual columns)也可以作为索引列.

     3.3 索引列的顺序对性能的影响
            在创建索引时,索引列的顺序将影响查询性能. 一般来说,把最频繁使用的列放在第一.
            例如: 指定索引列col1, col2, col3, 则访问col1, 或col1,col2也可以加速查询,但是访问col2,或col3或col2,col3并不会使用索引.

     3.4 限制一个表上的索引数量
           索引的数量并不是越多越好, 索引的数量越多意味着维护的成本越高. 因为对表的操作也会相应的更新索引.

     3.5 删除不再需要的索引
           以下情况可以考虑删除索引:
           1). 并不能加快查询的速度.
           2). 在应用程序里的查询并不使用该索引.
           3). 该索引在重建前必须被删除

     3.6 预估索引的大小和存储参数
           在创建索引之前对索引大小的发展进行评估,从而设置相应的存储参数. 从而提高使用该索引的应用程序的I/O性能.       

     3.7 为每个索引指定表空间
           为索引指定表空间也主要是I/O的考虑,以及如果表和索引在不同的表空间,必须确定表空间online才能使索引有效.

     3.8 并行创建索引
            和并行创建表一样,并行创建索引可以提高创建的速度. 但在创建期间需要更多的空间, 如: INITIAL=5M, parallel degree=12,那么需要60M的空间.

     3.9 创建索引时指定NOLOGGING属性
            创建索引时指定NOLOGGING属性将节省redo log空间, 减少创建时间, 提高并行创建大索引的性能. 但建完后最后做好备份.

     3.10 Rebuilding VS Coalescing 索引的利弊
            不合理的sizing或索引的增长都有可能产生碎片. 为了排除或减少碎片,可以重建rebuild或合并coalesce索引. 但是在执行之前先平衡下每种方法的利弊.
           
 Rebuild Index
 Coalesce Index
 快速移动到其它表空间
 不能被移动到其它表空间
 高成本: 需要更多的硬盘空间
 低成本:不需要更多的硬盘空间
 创建新树可能的话压缩树高度  合并同一分支的叶子块
 可以不删除原索引的情况下快速地改变存储和表空间的参数  快速释放叶子块的空间以备用


     3.11 Disabling 或 Dropping约束对索引的影响
              由于唯一约束和主键约束都自动创建相关的约束,因此当删除或disable唯一或主键约束时需要考虑删除和创建索引的成本.

admin026.gif

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9466564/viewspace-614152/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-02

  • 博文量
    126
  • 访问量
    211284