根据实际情况合理使用索引能优化查询速度
查询数据大于等于数据量的百分之10 就用全表扫描
1、索引与表一样,也属于段(segment)的一种。里面存放了用户的数据,跟表一样需要占用磁盘空间。
2、索引里的数据存放形式和表里的数据存放形式不一样。通常情况下,索引所占用的磁盘空间要比表要小的多,其主要作用是为了加快对数据的搜索速度,也可以用来保证数据的唯一性。
3、从物理上看,索引可以分为:分区和非分区索引、常规B树索引、位图(bitmap)索引、翻转(reverse)索引等。其中,B树索引属于最常见的索引。
B树索引是一个典型的树结构,其包含的组件主要是:
SQL> create table t1 as select * from all_objects;
all_objects 当前用户所拥有权限的所有对象
SQL> select index_name,blevel,num_rows from user_indexes where TABLE_NAME=‘t1’;
user_indexes 系统视图(存放索引名称以及索引是否唯一等信息)
index_name 索引名
blevel 分支层数
num_rows 所属行数
SQL> select index_name,column_name,column_position from dba_ind_columns where TABLE_NAME=‘t1’;
dba_ind_columns 系统视图(存放索引名称,对应的表和列)
SQL> create index in_s on t1(OBJECT_ID);
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)
(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;