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 ,
lru
latch).
•
CPU
负载的瓶颈在于
latch
的竞争。
Ø
全表加载内存比使用索引需要更少的
latch
Ø
全表加载只读取一次磁盘,以后不需要读取,索引需要读取至少两次磁盘,读取时间的加长更加剧了
latch
的竞争等待。
说明对于小表,ORACLE没有索引的性能优化有索引的查询原理。