10.推荐的FROM子句和WHERE子句应该如何写,并解释其原理。
类型
|
,描述
|
b-tree索引
|
最常最多使用的索引,其树结构与二叉树比较类似,根据ROWID快速定位所访问的行
|
bitmap索引
|
使用位图来管理与数据行的对应关系,适用于基数比较少的列
|
降序索引
|
降序索引在叶子节点中的存储从左到右是按照从大到小排序的;一般是针对逆向排序较多的查询时才使用该类型索引
|
函数索引
|
针对要频繁对列使用函数的索引,只有当查询语句包含该函数或者表达式时,基于函数的索引才会被调用
|
反转索引
|
反转了b*tree索引码中的字节,使索引条目分配更均匀,多用于并行服务器环境下,用于减少索引的竞争
|
分区索引
|
分区表的索引,又包括本地分区索引(本地前缀分区索引和本地非前缀分区索引)和全局索引,一般建议使用本地分区索引,因其与基表具有良好的数据均衡性和可维护性
|
类型
|
方式
|
发生条件
|
1.FULL INDEX SCANS
|
逐一读取索引中的所有块,由于索引中数据已按索引键排序,因此会忽略掉排序
|
1.ORDER BY中的列全部在该索引中时
2.ORDER BY中列的顺序满足索引中前导列的顺序时 3.使用GROUP BY且该子句中的列在索引中时 |
2.FAST FULL INDEX SCANS
|
只扫描索引中的数据,不会扫描表中的数据;由于索引中数据未按索引键排序,因此不能忽略掉排序
|
当同时满足下列条件是,Oracle用FFIS替代FIS:
1.查询的所有列均包含在索引中 2.索引中的列至少一个具有not null约束 |
3.INDEX RANGE SCANS
|
访问选择性数据最常用的扫描方式;按顺序的对某个索引进行扫描,返回数据是升序排列的,可以使用唯一索引和非唯一索引;如果对索引列使用ORDER BY/GROUP BY则可省略排序
|
1.在唯一索引上使用范围操作符(>、<、>=、<=、<>、BETWEEN)
2.在组合索引上使用部分列进行查询,导致查出多行 |
4.INDEX UNIQUE SCANS
|
扫描唯一索引或主键,要么返回一行数据要么返回0行数据
|
1.当使用唯一索引时
2.当使用主键时 |
5.INDEX SKIP SCANS
|
其实质是将索引分解成多个小的子索引来提高效率,系从9i开始引入
|
复合索引中前导列的取值是枚举的从而可以分拆为多个子索引,并且查询条件中不含前导列时
|
项目
|
多个索引
|
复合索引
|
复合索引是多个索引的
|
一、执行时间
|
0.281
|
0.11
|
39.15%
|
二、执行计划
|
|||
1.总耗费
|
1658
|
464
|
27.99%
|
2.I/O耗费
|
1562
|
462
|
29.58%
|
3.时间
|
19
|
6
|
31.58%
|
序号
|
命令
|
解释
|
1
|
SET AUTOTRACE OFF
|
此为默认值,即关闭Autotrace
|
2
|
SET AUTOTRACE ON
|
产生结果集和解释计划并列出统计
|
3
|
SET AUTOTRACE ON EXPLAIN
|
显示结果集和解释计划不显示统计
|
4
|
SETAUTOTRACE TRACEONLY
|
显示解释计划和统计,尽管执行该语句但将看不到结果集
|
5
|
SET AUTOTRACE TRACEONLY STATISTICS
|
只显示统计
|
序号
|
列名
|
解释
|
1
|
recursive call
|
递归调用SQL的个数;Oracle在执行这个SQL的时候,有时候会生成很多额外的SQL语句,这个就称为递归调用
|
2
|
db block gets
|
从buffer cache中读取的block的数量
|
3
|
consistent gets
|
从buffer cache中读取的undo数据的block的数量
|
4
|
physical reads
|
从磁盘读取的block的数量
|
5
|
redo size
|
DML生成的redo的大小
|
6
|
sorts (memory)
|
在内存执行的排序量
|
7
|
sorts (disk)
|
在磁盘上执行的排序量,如果memory空间使用不足,是会使用disk的空间的
|
8
|
bytes sent via SQL*Net to client
|
利用sql*net传入到client的字节数;
|
9
|
bytes received via SQL*Net from client
|
利用sql*net传出client的字节数;
|
项目
|
优化前
|
优化后
|
倍数
|
从持久层获取consistent gets(从buffer cache中读取的undo数据的block的数量)
|
21688
|
6950
|
3
|
物理读physical reads(从磁盘读取的block的数量)
|
21589
|
6928
|
3
|
递归调用recursive call
|
0
|
1
|
N/A
|
时间(毫秒)
|
2070
|
1078
|
2
|