您的位置:首页 > 其它

索引

2015-07-04 14:05 169 查看
数据库查询时是会有缓存的:
ORACLE data一般缓存在SGA(系统全局区,System Global Area)中的data cache中
表A有10000条数据,在0:00时刻对其进行查询,则将表A的所有数据块从disk缓存至data cache中。
因此第二次查询时直接从data cache中获得速度变快。 2.0:05时刻 对表A进行更新等操作,20000行。
再次对表A进行查询,之前没有变化的数据块仍然直接从data cache中直接获得。发生过变更,或新增的数据块,
需要重新从disk读入data cache中,如果data cache空间已满,就会将之前发生变更的脏数据块及不常使用的数据块清空出data cache,
然后缓存新的数据块。
联合索引:
create index IDX_EB_JBXX_SORT on EB_JBXX(JDRQ DESC,ZXID DESC);
通用索引:(B树索引)
create index IDX_EB_JBXX_XB on EB_JBXX(XB);
唯一索引:
create unique index IDX_EB_JBXX_XB on EB_JBXX(XB);
位图索引:
create bitmap index IDX_EB_JBXX_XB on EB_JBXX(XB);

主键和唯一索引的区别:
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、***号等。
在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。

位图索引示例: ----------------- 1个公司的客户数据  CUSTOMER# MARITAL_STATUS REGION GENDER INCOME_LEVEL  --------- --------------- -------- ------- ------------  101 single east male bracket_1  102 married central female bracket_4  103 married west female bracket_2  104 divorced west male bracket_4  105 single central female bracket_2  106 married central female bracket_3  MARITAL_STATUS,REGION,GENDER,INCOME_LEVEL字段都是有较少的独特值(婚姻状况和地域只有三种值,性别只有2种值,收入级别只有4种值),较为适合在这些字段上创建位图索引。但在CUSTOMER#上不适合创建位图索引,因为该字段独特值较多。  相反,在该字段上创建一个唯一索引,将十分有效。
被索引的列的值更新修改后会导致索引失效应该建索引列的特点:1)在经常需要搜索的列上,可以加快搜索的速度;2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
不应该建索引列的特点:1)对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。2)对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。3)对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。4)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

索引扫描优化相关:------------------------------------------------------------------------------------在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值索引扫描可以由2步组成:(1) 扫描索引得到对应的rowid值。 (2) 通过找到的rowid从表中读出具体的数据。这两步每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的I/O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果多大表进行索引扫描,取出的数据如果大于总量的5% -- 10%,使用索引扫描会效率下降很多。
索引唯一扫描(index unique scan)
索引范围扫描(index range scan)
索引全扫描(index full scan)
索引快速扫描(index fast full scan)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: