根据实际情况合理使用索引能优化查询速度
查询数据大于等于数据量的百分之10 就用全表扫描
1、索引与表一样,也属于段(segment)的一种。里面存放了用户的数据,跟表一样需要占用磁盘空间。
2、索引里的数据存放形式和表里的数据存放形式不一样。通常情况下,索引所占用的磁盘空间要比表要小的多,其主要作用是为了加快对数据的搜索速度,也可以用来保证数据的唯一性。
3、从物理上看,索引可以分为:分区和非分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。其中,B树索引属于最常见的索引。
B树索引是一个典型的树结构,其包含的组件主要是:
- 叶子节点(Leaf node):包含条目直接指向表里的数据行。
- 分支节点(Branch node):包含的条目指向索引里其他的分支节点或是叶子节点。
- 根节点(Root node):一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点。
- 对于分支节点来说:(其包含的索引条目默认是升序排序,也可以在创建索引时指定为降序排序)。每个索引条目(每条记录)都具有两个字段。
- 对于叶子节点块来说:其包含的索引条目与分支节点一样,默认升序排序。第二个字段表示键值所对应的记录行ROWID,该ROWID是记录行在表里的物理地址。
如果索引是创建在非分区表上或者索引是在分区表上的本地索引的话,则该ROWID占用6个字节;如果索引是创建在分区表上的全局索引的话,则该ROWID占用10个字节。
实验:
1、创建一个实验表:
SQL> create table t1 as select * from all_objects;
all_objects 当前用户所拥有权限的所有对象
2、尝试查看表的内容
SQL> select index_name,blevel,num_rows from user_indexes where TABLE_NAME=‘t1’;
user_indexes 系统视图(存放索引名称以及索引是否唯一等信息)
index_name 索引名
blevel 分支层数
num_rows 所属行数
3、尝试查看表内容
SQL> select index_name,column_name,column_position from dba_ind_columns where TABLE_NAME=‘t1’;
dba_ind_columns 系统视图(存放索引名称,对应的表和列)
4、创建索引
SQL> create index in_s on t1(OBJECT_ID);
5、查看索引字段
SQL> select index_name,blevel,num_rows from user_indexes where table_name=‘t1’;
BLEVEL为1(这是分支层数,比HEIGHT小1,因为BELEVEL不把叶子块层算在内)说明HEIGHT为2,要找到叶子需要1个I/O,(访问叶子本身还需要第二个I/O)
6、启动跟踪
(1)如果是系统用户拥有最高权限,则可以直接
SQL> set autotrace traceonly;
再进行查看执行计划和统计信息
SQL> select OBJECT_ID from t1 where OBJECT_ID=26;
(2)如果是普通用户则需要授权
①登录到sys用户创建autotrace角色并授予一定权限,将该角色赋予需要进行跟踪分析的用户
SQL> create role plustrace;
SQL> grant select on v_$sesstat to plustrace; # 动态性能视图
SQL> grant select on v_$statname to plustrace;
SQL> grant select on v_$mystat to plustrace;
SQL> grant plustrace to dba with admin option; # 将plustrace授予dba用户
SQL> grant plustrace to t1;
再进行查看执行计划和统计信息
SQL> set autotrace traceonly;
SQL> select OBJECT_ID from t1 where OBJECT_ID=26;
②登录sys用户,运行utlxplan.sql
sqlplus / as sysdba
explain plan for ..
SQL> @$ORACLE_HOME/rdbms/admin/utlxpls.sql;
//创建一个表(PLAN_TABLE)。该表用于观察 SQL 语句的运行计划(Execution Plan)。
执行plustrace.sql脚本
SQL> @$ORACLE_HOME/sqlplus/admin/plustrce.sql
//创建 plustrace角色。
授权
SQL> grant plustrace to scott;
//将 plustrace角色授予当前用户(无 DBA 角色的用户),或 grant plustrace to public。
再进行查看执行计划和统计信息
SQL> set autotrace traceonly;
SQL> select OBJECT_ID from t1 where OBJECT_ID=26;