ORACLE SQL性能调优系列一

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没有索引的性能优化有索引的查询原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值