Oracle数据库的优化--索引

来源:互联网 发布:mysql 建库语句 utf8 编辑:程序博客网 时间:2024/05/16 11:30

本文主要讲述索引的基本用发和查看索引的执行–(执行计划)

最近lz写平台在测试的时候遇到,点击菜单加载非常慢。因为楼主展示的信息量较大,每组1万左右。
求教得到优化的方式,可以加快数据库的查询速度—数据库的索引

什么是数据库索引

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持
其主要目的就是加快查询速度
但是加了索引后,在增上改时,除数据外还要对索引进行操作。所以在数据量较少时不建议使用索引

lz主要用在点击查询当前汇总信息所对应的明细,使用到的索引。使用的pl/sql工具
比较常见的就是对where子句的条件添加索引:

--创建索引create idnex tablename_字段名1 on table(字段名1);create idnex tablename_字段名1_字段名2 on table(字段名1,字段名2);--此为多重索引--lz用到的create index detailed_batchnumber on detailed(batchnumber);

F8一下索引就创建成功了

执行计划

索引创建成功,去平台试了一下,果然快乐很多,但是该如何查看索引呢?
就引出了另外的知识–执行计划

什么事执行计划:
执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述
lz使用的pl/SQL查看的执行计划,也可以用toad查看。
查看执行计划有两种方式,

第一种

选中sql语句点击F5进行查看
这里写图片描述
根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行)
可点击上面的三角号进行查看执行顺序
同一级如果某个动作没有子ID就最先执行
同一级的动作执行时遵循最上最右先执行的原则

使用这种方法需要配置查看执行计划的展示数据:

工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计划中的列

这里写图片描述

第二种查看方式

-- 查看执行计划----可使用f5,查看EXPLAIN PLAN FORSELECT * FROM detailed WHERE batchnumber='1000112017112715080570286110';select * from table(dbms_xplan.display);--三行代码,第一三行固定,第二行是你要查看执行计划的语句

这里写图片描述

上面显示的信息为执行代码所得到的执行计划
上图中 TABLE ACCESS BY … 即描述的是该动作执行时表访问(或者说Oracle访问数据)的方式;

表访问的几种方式:(非全部)
TABLE ACCESS FULL(全表扫描)
TABLE ACCESS BY ROWID(通过ROWID的表存取)
TABLE ACCESS BY INDEX SCAN(索引扫描)

1 TABLE ACCESS FULL(全表扫描):Oracle会读取表中所有的行,并检查每一行是否满足SQL语句中的 Where 限制条件;全表扫描时可以使用多块读(即一次I/O读取多块数据块)操作,提升吞吐量;使用建议:数据量太大的表不建议使用全表扫描2 TABLE ACCESS BY ROWID(通过ROWID的表存取) :先说一下什么是ROWID?ROWID是由Oracle自动加在表中每行最后的一列伪列,既然是伪列,就说明表中并不会物理存储ROWID的值;你可以像使用其它列一样使用它,只是不能对该列的值进行增、删、改操作;一旦一行数据插入后,则其对应的ROWID在该行的生命周期内是唯一的,即使发生行迁移,该行的ROWID值也不变。让我们再回到 TABLE ACCESS BY ROWID 来:行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID可以快速定位到目标数据上,这也是Oracle中存取单行数据最快的方法;3 TABLE ACCESS BY INDEX SCAN(索引扫描):在索引块中,既存储每个索引的键值,也存储具有该键值的行的ROWID。索引扫描其实分为两步:Ⅰ:扫描索引得到对应的ROWIDⅡ:通过ROWID定位到具体的行读取数据