SQL基础--索引
索引的概念:
在数据库中索引是用于提升数据库查询操作性能的一种手段,但在频繁更新的表上,索引反而会降低性能。
常用的索引结构:
- B*树索引
- 位图索引
B树索引:
B书索引是最基本的索引结构,Oracle中默认建立的索引类型就是此类型索引,
一般B数索引在检索高基数数列(该例重复内容较少或没有)的时候可以提供高性能检索
B书索引采用的就是用的二叉树排列,在叶子节点中有ROWID的值,用ROWID这种方式查询效率是最高的。
B树索引建立语法:
create index [用户名.]索引名称 on [用户名.]表名称 (列名称 [asc|desc])
--默认是ASC
演示:
--没有建立索引的查询:
SQL> set autotrace on ##开启自动跟踪功能 SQL> select * from scott.emp where sal<1500;
结果:
已用时间: 00: 00: 00.02 执行计划 ---------------------------------------------------------- Plan hash value: 3956160932 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 7 | 252 | 3 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| EMP | 7 | 252 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("SAL"<1500) 统计信息 ---------------------------------------------------------- 1 recursive calls 0 db block gets 8 consistent gets 0 physical reads 0 redo size 1220 bytes sent via SQL*Net to client 520 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 5 rows processed
从中可以看出用了全盘扫描
--建立B数索引
SQL> create index emp_sal_ind on emp(sal);
再次追踪:
已用时间: 00: 00: 00.01 执行计划 ---------------------------------------------------------- Plan hash value: 317084801 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 7 | 252 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 7 | 252 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | EMP_SAL_IND | 7 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("SAL"<1500) 统计信息 ---------------------------------------------------------- 0 recursive calls 0 db block gets 4 consistent gets 0 physical reads 0 redo size 1238 bytes sent via SQL*Net to client 520 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 5 rows processed
对比上面没建立索引的,可以看出耗费时间和CPU都减少了。
查询用户的索引视图
--user_indexes
SQL> select index_name,index_type,status from user_indexes; Index name Index type STATUS ------------------------------ --------------- -------- PK_MID NORMAL VALID PK_EMP NORMAL VALID EMP_SAL_IND NORMAL VALID PK_DEPT NORMAL VALID
主键都自动设置了索引。
--user_ind_columns
查看索引建在哪个字段上
SQL> select * from user_ind_columns where index_name='EMP_SAL_IND'; INDEX_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND ------------------------------ ------------------------------ ----------------------------------------------- EMP_SAL_IND EMP SAL 1 22 0 ASC
位图索引
适用于低基数列,重复的数据多
创建语法:
create bitmp index [用户名.]索引名称 on [用户名.]表名称 (列名称 [asc|desc])
实例:
--在deptno上建立位图索引
SQL> create bitmap index emp_deptno_ind on emp(deptno);
删除索引:
由于索引本身要进行数据维护,一般而言会占用较大的磁盘空间,随着表的增长会越来越大,对于那些不经常使用的索引应该删除。
删除语法:
drop index 索引名称;