莫相离 发表于 2015-1-16 22:43:59

MYSQL编程:索引在ORACLE数据库中的使用剖析

MySQL的支持者们却认为,MySQL所保留的功能都是精华,并且是你部署、MySQL学习教程配置和维护这个数据库所必不可少的一些功能。oracle|数据|数据库|索引
索引在数据库中的使用剖析





索引是进步数据查询最无效的办法,也是最难周全把握的手艺,由于准确的索引大概使效力进步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’

查询中与别的表联系关系的字段

字段经常创建了外键干系

如zl_ydcf(用电成分)中的jldb_bh(计量点表编号)

select*fromzl_ydcfa,zl_yhdbbwherea.jldb_bh=b.jldb_bhandb.jldb_bh=’540100214511’



查询中排序的字段

排序的字段假如经由过程索引往会见那将年夜年夜进步排序速率

select*fromzl_yhjbqkorderbyqc_bh(创建qc_bh索引)

select*fromzl_yhjbqkwhereqc_bh=7001orderbycb_sx(创建qc_bh+cb_sx索引,注:只是一个索引,个中包含qc_bh和cb_sx字段)

查询中统计或分组统计的字段

selectmax(hbs_bh)fromzl_yhjbqk

selectqc_bh,count(*)fromzl_yhjbqkgroupbyqc_bh



甚么情形下应不建或少建索引

表纪录太少

假如一个表只要5笔记录,接纳索引往会见纪录的话,那起首需会见索引表,再经由过程索引表会见数据表,一样平常索引表与数据表不在统一个数据块,这类情形下ORACLE最少要往复读取数据块两次。而不必索引的情形下ORACLE会将一切的数据一次读出,处置速率明显会比用索引快。

如表zl_sybm(利用部门)一样平常只要几笔记录,除主关头字外对任何一个字段建索引都不会发生功能优化,实践上假如对这个表举行了统计剖析后ORACLE也不会用你建的索引,而是主动实行全表会见。如:

select*fromzl_sybmwheresydw_bh=5401(对sydw_bh创建索引不会发生功能优化)



常常拔出、删除、修正的表

对一些常常处置的营业表应在查询同意的情形下只管削减索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等营业表。



数据反复且散布均匀的表字段

假设一个表有10万行纪录,有一个字段A只要T和F两种值,且每一个值的散布几率约莫为50%,那末对这类表A字段建索引一样平常不会进步数据库的查询速率。



常常和主字段一块查询但主字段索引值对照多的表字段

如gc_dfss(电费实收)表常常按免费序号、户标识编号、抄表日期、电费产生年代、操纵标记来详细查询某一笔收款的情形,假如将一切的字段都建在一个索引里那将会增添数据的修正、拔出、删除工夫,从实践上剖析一笔收款假如按免费序号索引就已将纪录削减到只要几条,假如再按前面的几个字段索引查询将对功能不发生太年夜的影响。



怎样只经由过程索引前往了局

一个索引一样平常包含单个或多个字段,假如能不会见表间接使用索引就前往了局那将年夜年夜进步数据库查询的功能。对照以下三个SQL,个中对表zl_yhjbqk的hbs_bh和qc_bh字段创建了索引:

1selecthbs_bh,qc_bh,xh_bzfromzl_yhjbqkwhereqc_bh=’7001’





实行路径:

SELECTSTATEMENT,GOAL=CHOOSE112655565

TABLEACCESSBYINDEXROWIDDLYXZL_YHJBQK112655565

INDEXRANGESCANDLYX区册索引1265

均匀实行工夫(0.078秒)

2selecthbs_bh,qc_bhfromzl_yhjbqkwhereqc_bh=’7001’

实行路径:

SELECTSTATEMENT,GOAL=CHOOSE112653710

TABLEACCESSBYINDEXROWIDDLYXZL_YHJBQK112653710

INDEXRANGESCANDLYX区册索引1265

均匀实行工夫(0.078秒)

3selectqc_bhfromzl_yhjbqkwhereqc_bh=’7001’

实行路径:

SELECTSTATEMENT,GOAL=CHOOSE12651060

INDEXRANGESCANDLYX区册索引12651060

均匀实行工夫(0.062秒)



从实行了局能够看出第三条SQL的效力最高。实行路径能够看出第1、2条SQL都多实行了TABLEACCESSBYINDEXROWID(经由过程ROWID会见表)这个步骤,由于前往的了局列中包含以后利用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3条SQL间接经由过程QC_BH前往了却果,这就是经由过程索引间接前往了局的办法。



怎样重修索引

alterindex表电量了局表主键rebuild



怎样疾速新建年夜数据量表的索引

假如一个表的纪录到达100万以上的话,要对个中一个字段建索引大概要花很长的工夫,乃至招致服务器数据库逝世机,由于在建索引的时分ORACLE要将索引字段一切的内容掏出并举行周全排序,数据量年夜的话大概招致服务器排序内存不敷而援用磁盘互换空间举行,这将严峻影响服务器数据库的事情。办理办法是增年夜数据库启动初始化中的排序内存参数,假如要举行大批的索引修正能够设置10M以上的排序内存(ORACLE缺省巨细为64K),在索引创建完成后应将参数修正返来,由于在实践OLTP数据库使用中一样平常不会用到这么年夜的排序内存。



叶正盛
2003-08-15
业界普遍的声音认为:“MySQL是一个可靠的数据库系统,MySQL学习教程无论是在嵌入式或大型群集系统的部署中,还是在基于Web的应用程序领域。

小女巫 发表于 2015-1-19 21:50:43

代替了原来VB式的错误判断。比Oracle高级不少。

简单生活 发表于 2015-1-27 20:52:52

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

因胸联盟 发表于 2015-2-5 10:48:09

SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.

乐观 发表于 2015-2-11 09:26:27

至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。

仓酷云 发表于 2015-3-2 08:57:37

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

愤怒的大鸟 发表于 2015-3-11 02:58:31

习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。

飘灵儿 发表于 2015-3-17 19:12:08

财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..

只想知道 发表于 2015-3-24 21:38:02

财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
页: [1]
查看完整版本: MYSQL编程:索引在ORACLE数据库中的使用剖析