oracle的内存结构
SGA和SQL
ü当用户访问的SQL语句已经缓存在SGA中,那么该SQL就很不用再解析了,缩短SQL的执行时间。
ü当用户访问的数据已经缓存在SGA中,那么就不用再从磁盘读取,减少磁盘IO次数。
üSGA越大缓存的数据(包含表和索引)越多,执行的磁盘IO越少,性能越好。
SQL执行过程
ü1、语法检查(syntaxcheck)
•语法是否合法;
ü2、语义检查(semanticcheck)
•表字段以及权限检验;
ü硬解析:SQL初次执行
1.根据WHERE子句和OBJECT的统计信息(optimizer),选择相关的优化器(CBO/RBO),创建解析树。
2.根据解析树,生成执行计划,放入SGA共享池的library cache中。
ü软解析:SQL及执行计划已在SGA中
执行SQL,返回结果(executeand return)
SQL软解析要求
üSQL文本必须完全一样,包括空格,大小写和换行。
1.SELECT
* FROM WARE_INFO(基准SQL);
2.SELECT
* FROM WARE_INFO(多一个空格);
3.SELECT
*
FROM WARE_INFO(有换行);
ü两个语句所指的对象必须完全相同。
1.SELECT
* FROM WARE_INFO;
和同义词WARE_INFO: SELECT * FROM WARE_INFO是不一样的。
ü两个SQL语句中必须使用相同的名字的绑定变量(bindvariables)。
SQL访问行数据
通过索引访问
全表扫描访问
SQL访问基础
üORACLE读取数据是以块为单位的,每块默认大小是8k,小表指的就是表的块数比较少。
ü对应小表全表扫描比索引扫描要快,减少一致性读次数和磁盘IO读取次数,除非数据都在索引中。
–全表扫描运用多块加载,默认一次加载16块,磁盘IO=tbl_blocks/16。
–索引扫描获取表数据把全表索引和表加载到内存次数=index_blocks*degree+
tbl_blocks。
–一致性读次数上索引扫描比全表扫描要至少多一次索引扫描。
–一次一致性读至少需要获取两次latch(cachelatch ,lrulatch).
•CPU负载的瓶颈在于latch的竞争。
Ø全表加载内存比使用索引需要更少的latch
Ø全表加载只读取一次磁盘,以后不需要读取,索引需要读取至少两次磁盘,读取时间的加长更加剧了latch的竞争等待。
说明对于小表,ORACLE没有索引的性能优化有索引的查询原理。