Oracle中索引应用的深入分析

索引是改进数据查询最有效的方法,也是最难掌握的技术。因为正确的索引可以使效率提高10000倍,无效索引可能浪费数据库空间,甚至大大降低查询性能。

1。指数的管理成本
1。存储索引磁盘空间
2。执行数据修改操作(插入、更新、删除)所生成的索引维护
三.数据处理所需的额外背景空间。

两。实际数据修改测试:
在插入10000行记录测试时,表有字段a、b和c。
当没有索引时,平均完成时间是2.9秒。
在索引被索引后,字段的平均完成时间为6.7秒。
场和B场的平均完成时间为10.3秒。
在字段、b字段和C字段被索引之后,平均完成时间为11.7秒。
从上面的测试结果可以清楚地看出,索引影响数据修改。

三。索引按存储方式分类。
1、b *树索引
b树索引是同类图书存储结构中最常用的索引、索引结构,两种类型的分支块的数据存储块分支和叶子对应于图书目录,相当于特定索引页页,b树索引用于通用索引和唯一约束索引。

2。位图索引
位图索引存储主要用于节省空间,减少oracle对数据块的访问。它使用位图偏移方法来对应表的行ID号。位图索引通常是一个表的字段太多重复的值。在实际处理位图索引(数据密集型交易)更少,因为OLTP表,修改,删除了大量新的Oracle操作,每个操作都会对数据的操作块锁,所以很多人是生成数据块锁等待死锁很容易。位图应用OLAP是有利的(数据分析处理),因为大多数OLAP数据库查询操作,一般采用数据仓库技术。因此,使用位图索引可以节省大量数据。

四。索引按功能分类
1。唯一索引
独特的指标有两个功能,一个是数据的约束,另一个是数据索引、数据约束主要是用来保证数据的完整性,并通过唯一索引对应于一个独特的ROWID产生的索引记录各指标。

2。主要的关键指标
主索引索引生成的索引与唯一索引相同,但在数据库中设置主关键字时,系统自动建立索引。

三.总指数
一般索引不产生数据约束,其功能是为字段建立索引表,提高数据查询速度。

五。索引按索引对象分类。
1。单栏索引(表单字段索引)
2。多列索引(表的多个字段索引)
三.函数索引(字段上函数操作的索引)

函数索引的建立方法:
在gc_dfss创建索引收费日期索引(trunc(sk_rq))
创建索引的完整的客户数量指标对yhzl(qc_bh | | kh_bh)
当函数索引,如果当前会话是指当前会话的当前会话的query_rewrite_enabled是真实的。
改变会话设置query_rewrite_enabled =真

注:如果用户函数被索引,则用户函数应该加上确定性参数,这意味着当输入值固定时,函数的返回值是固定的:
创建或替换功能trunc_add(input_date日期)返回日期确定
作为
开始
返回trunc(input_date + 1);
最后trunc_add;

六。应用指标扫描分类
1.index独特的扫描(通过索引唯一值扫描)
SELECT * FROM zl_yhjbqk哪里hbs_bh = '5420016000

2.index范围扫描(通过索引范围扫描)
SELECT * FROM zl_yhjbqk哪里hbs_bh > '5420016000
SELECT * FROM zl_yhjbqk哪里qc_bh > '7001

3.index快速全扫描(快速扫描的索引值)
选择hbs_bh从zl_yhjbqk阶hbs_bh
select count(*)从zl_yhjbqk
选择qc_bh从zl_yhjbqk组qc_bh

七。在这种情况下应该建立索引。
1的基调。表自动建立唯一索引。
hbs_bh(用户身份证号码),如zl_yhjbqk(用户基础)

2字段的唯一约束。桌子
Oracle使用索引来确保数据的完整性。
如lc_bh + hj_sx(进程数+链接顺序)在lc_hj(环节)

三.直接条件查询字段
用于条件约束的sql字段
qc_bh(登记号)在zl_yhjbqk(用户群)
SELECT * FROM zl_yhjbqk哪里qc_bh = '7001

4。在与其他表关联的查询中,经常建立外键关系。
如在zl_ydcf的jldb_bh(测量点表数)
SELECT * FROM zl_ydcf,zl_yhdb在哪里a.jldb_bh = b.jldb_bh和b.jldb_bh = '540100214511

5。查询中的排序字段
如果通过索引访问排序字段,则排序速度将大大提高。
选择qc_bh从zl_yhjbqk秩序*(建立qc_bh指数)
SELECT * FROM zl_yhjbqk哪里qc_bh = '7001'order通过cb_sx(建立一个qc_bh + cb_sx指数,注意:只有一个指标,包括qc_bh和cb_sx领域)

6。查询中统计或分组统计的字段
Select max (hbs_bh) from zl_yhjbqk
选择qc_bh,计数(*)从zl_yhjbqk组qc_bh

八。在什么情况下,不应该建立索引或索引。
1。表记录太少
如果一个表只有5条记录,使用索引访问记录,访问索引表的第一需要,通过索引访问表数据块中的总索引表和数据表,在这种情况下,Oracle应该至少两次读取数据块。没有索引,Oracle将读取所有数据在同一时间,并且处理速度明显比指数更快。

表zl_sybm(部门)一般只有几条记录,除了任何字段建立索引主键不会产生性能优化,如果事实上分析了Oracle表不会使用你建立的索引,但自动执行全表访问等:
SELECT * FROM zl_sybm哪里sydw_bh = '5401(索引sydw_bh不产生性能优化)

2。经常插入、删除和修改的表
一些经常办理业务的表应该尽量减少指标,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy,等等,当查询是允许的。

三.具有重复分布平均数据的表字段
如果一个表有10万行,a字段只有t和f的两个值,并且每个值的分布概率约为50%,那么索引该表的字段一般不会提高数据库的查询速度。

4。主字段经常查询的表字段,但在主字段中有更多的索引值
如gc_dfss(电力支付)表通常根据充电次数,用户识别号码、抄表日期、收费日期,查询具体操作签字笔的集合,如果所有的领域都是建立在一个指数,会增加数据的修改、插入和删除的时间分析,其实如果你按笔收费序号索引记录减少到只有几个,如果按照后面的索引性能的几个方面不会有太大的影响。

九。如何仅通过索引返回结果
指标一般包括一个或多个领域,这将大大如果指数可以返回不直接访问表提高数据库查询的性能。以下三个SQL进行比较,其中hbs_bh和表zl_yhjbqk qc_bh字段索引:

1选择hbs_bh,qc_bh,xh_bz从zl_yhjbqk哪里qc_bh = '7001
执行路径:
选择语句,目标=选择112655565
通过索引rowid dlyx zl_yhjbqk 112655565表访问
索引范围扫描dlyx指数1265
平均执行时间(0.078秒)

2选择hbs_bh,qc_bh从zl_yhjbqk哪里qc_bh = '7001
执行路径:
选择语句,目标=选择112653710
通过索引rowid dlyx zl_yhjbqk 112653710表访问
索引范围扫描dlyx指数1265
平均执行时间(0.078秒)

3选择从哪里qc_bh zl_yhjbqk qc_bh = '7001
执行路径:
选择语句,目标=选择12651060
索引范围扫描dlyx指数12651060
平均执行时间(0.062秒)
它可以从执行的结果,第三的SQL效率最高见。执行路径可以看出,第一、二SQL表访问的索引rowid(通过ROWID访问表)这一步,因为在栏目包括当前使用的索引返回的结果(qc_bh)在非索引列(hbs_bh,xh_bz),和第三的SQL直接通过qc_bh返回结果,这是该指数返回结果的方法。

十。如何快速构建新的大数据量索引
如果一桌100万多字的记录,一个指数构建的领域可能需要很长的时间,甚至导致服务器崩溃的数据库,因为Oracle索引的索引字段的所有内容都拿出来进行全面梳理的建设,大量的数据可能会导致服务器的内存种类参考磁盘空间不足,这将严重影响数据库服务器的工作。解决的办法是排序的内存初始化参数增大数据库启动,如果大量的索引修改可以设置10m以上的内存种类(Oracle默认大小为64K),指数应该是参数修改后完成后成立的,因为在实际的OLTP数据库应用程序一般不这么使用分类内存。