ORACLE SQL性能调优系列一

本文探讨了Oracle数据库中SQL语句的执行流程,包括软解析与硬解析的区别及其对性能的影响。此外还讨论了全表扫描与索引扫描的性能对比,并分析了小表查询时性能优化的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值