索引在中的应用分析

来源:互联网 发布:68淘宝小号网 编辑:程序博客网 时间:2024/05/06 04:51
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

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




 


索引的管理成本



1、 存储索引的磁盘空间



2、 执行数据修改操作(INSERT、UPDATE、DELETE)产生的索引维护



3、 在数据处理时回需额外的回退空间。




 


实际数据修改测试:



一个表有字段A、B、C,同时进行插入10000行记录测试



在没有建索引时平均完成时间是2.9秒



在对A字段建索引后平均完成时间是6.7秒



在对A字段和B字段建索引后平均完成时间是10.3秒



在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒



从以上测试结果可以明显看出索引对数据修改产生的影响




 


索引按存储方法分类



B*树索引



B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引



位图索引



位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。




 


索引按功能分类



唯一索引



唯一索引有两个作用,一个是数据约束,一个是数据索引,其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。




 


主关键字索引



主关键字索引产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。



一般索引



一般索引不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。




 



 


索引索引对象分类




 


单列索引(表单个字段的索引



多列索引(表多个字段的索引



函数索引(对字段进行函数运算的索引



建立函数索引的方法:



createindex收费日期索引onGC_DFSS(trunc(sk_rq))



createindex完全客户编号索引onyhzl(qc_bh||kh_bh)



在对函数进行了索引后,如果当前会话要引用应设置当前会话的query_rewrite_enabled为TRUE。



altersessionsetquery_rewrite_enabled=true



注:如果对用户函数进行索引的话,那用户函数应加上deterministic参数,意思是函数在输入值固定的情况下返回值也固定。例:



createorreplacefunctiontrunc_add(input_datedate)returndatedeterministic



as



begin



   returntrunc(input_date+1);



endtrunc_add;




 


应用索引的扫描分类



INDEXUNIQUESCAN(按索引唯一值扫描)



select*fromzl_yhjbqkwherehbs_bh='5420016000'



INDEXRANGESCAN(按索引值范围扫描)



select*fromzl_yhjbqkwherehbs_bh>'5420016000'



select*fromzl_yhjbqkwhereqc_bh>'7001'



INDEXFASTFULLSCAN(按索引值快速全部扫描)



selecthbs_bhfromzl_yhjbqkorderbyhbs_bh



selectcount(*)fromzl_yhjbqk



selectqc_bhfromzl_yhjbqkgroupbyqc_bh




 


什么情况下应该建立索引



表的主关键字



自动建立唯一索引



如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)



表的字段唯一约束



ORACLE利用索引来保证数据的完整性



如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)



直接条件查询的字段



在SQL中用于条件约束的字段



如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)



select*fromzl_yhjbqkwhereqc_bh=’7001’1<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击