数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

oracle优化心得摘抄


发布日期:2018年07月11日
 
oracle优化心得摘抄

数据库优化oraclei

很多的时侯做Oracle DBA的我们当应用管理员向我们通告现在应用很慢数据库很慢的时侯我们到数据库时做几个示例的Select也发现同样的问题时有些时侯我们会无从下手因为我们认为数据库的各种命种率都是满足Oracle文档的建议实际上如今的优化己经向优化等待(waits)转型了实际中性能优化最根本的出现点也都集中在IO这是影响性能最主要的方面由系统中的等待去发现Oracle库中的不足操作系统某些资源利用的不合理是一个比较好的办法下面把我的一点实践经验与大家分享一下本文测重于Unix环境

通过操作系统的一些工具检查系统的状态比如CPU内存交换磁盘的利用率根据经验或与系统正常时的状态相比对有时系统表面上看起来看空闲这也可能不是一个正常的状态因为cpu可能正等待IO的完成除此之外我们还应观注那些占用系统资源(cpu内存)的进程

如何检查操作系统是否存在IO的问题?使用的工具有sar这是一个比较通用的工具

Rp#sar u

即每隔秒检察一次共执行当然这些都由你决定了

示例返回

HPUX hpn B U / //

:: %usr %sys %wio %idle

我在redhat下查看是这种结果不知%system就是所谓的%wio

Linux ELsmp (YY) //

:: AM CPU %user %nice %system %idle

:: AM all

:: AM all

:: AM all

:: AM all

:: AM all

:: AM CPU %user %nice %system %idle

:: AM all

:: AM all

:: AM all

:: AM all

其中的%usr指的是用户进程使用的cpu资源的百分比%sys指的是系统资源使用cpu资源的百分比%wio指的是等待io完成的百分比这是值得我们观注的一项%idle即空闲的百分比如果wio列的值很大如在%以上说明你的系统的IO存在瓶颈你的CPU花费了很大的时间去等待IO的完成Idle很小说明系统CPU很忙像我的这个示例可以看到wio平均值为说明io没什么特别的问题而我的idle值为零说明我的cpu已经满负荷运行了

当你的系统存在IO的问题可以从以下几个方面解决

*联系相应的操作系统的技术支持对这方面进行优化比如hpux在划定卷组时的条带化等方面

*查找Oracle中不合理的sql语句对其进行优化

*对Oracle中访问量频繁的表除合理建索引外再就是把这些表分表空间存放以免访问上产生热点再有就是对表合理分区

关注一下内存

常用的工具便是vmstat对于hpunix来说可以用glanceAix来说可以用topas当你发现vmstat中pi列非零memory中的free列的值很小glancetopas中内存的利用率多于%时这时说明你的内存方面应该调节一下了方法大体有以下几项

*划给Oracle使用的内存不要超过系统内存的/一般保在系统内存的%为益

为系统增加内存

*如果你的连接特别多可以使用MTS的方式

*打全补丁防止内存漏洞

如何找到点用系用资源特别大的Oracle的session及其执行的语句

Hpunix可以用glancetop

IBM AIX可以用topas

此外可以使用ps的命令

通过这些程序我们可以找到点用系统资源特别大的这些进程的进程号我们就可以通过以下的sql语句发现这个pid正在执行哪个sql这个sql最好在pl/sql developertoad等软件中执行 把<>中的spid换成你的spid就可以了

SELECT ausernameamachineaprogramasidaserial#astatuscpiececsql_text from v$session av$process bv$sqltext c WHERE bspid=ORCL AND baddr=apaddr AND asql_address=caddress(+)order BY cpiece

我们就可以把得到的这个sql分析一下看一下它的执行计划是否走索引对其优化避免全表扫描以减少IO等待从而加快语句的执行速度

提示我在做优化sql时经常碰到使用in的语句这时我们一定要用exists把它给换掉因为Oracle在处理In时是按Or的方式做的即使使用了索引也会很慢

比如

SELECT colcolcol FROM table a

WHERE l not in (SELECT col FROM table)

可以换成

SELECT colcolcol FROM table a

WHERE not exists

(SELECT x FROM table b

WHERE l=l)

另一个有用的脚本查找前十条性能差的sql

SELECT * FROM (select PARSING_USER_IDEXECUTIONSSORTSCOMMAND_TYPEDISK_READSsql_text FROM v$sqlarea

order BY disk_reads DESC )where ROWNUM< ;

迅速发现Oracle Server的性能问题的成因我们可以求助于v$session_wait这个视图看系统的这些session在等什么使用了多少的IO以下是我提供的参考脚本

脚本说明查看占io较大的正在运行的session

SELECT sesidseserial#prSPIDseusernamesestatusseterminalseprogramseMODULE

sesql_addresssteventstptextsiphysical_readssiblock_changes FROM v$session se

v$session_wait stv$sess_io siv$process pr

WHERE stsid=sesid AND stsid=sisid

AND sePADDR=prADDR

AND sesid>

AND stwait_time=

AND stevent NOT LIKE %SQL%

ORDER BY physical_reads DESC

对检索出的结果的几点说明

我是按每个正在等待的session已经发生的物理读排的序因为它与实际的IO相关

你可以看一下这些等待的进程都在忙什么语句是否合理?

Select sql_address from v$session where sid=;

Select * from v$sqltext where address=;

执行以上两个语句便可以得到这个session的语句

你也以用alter system kill session sidserial#;把这个session杀掉

应观注一下event这列这是我们调优的关键一列下面对常出现的event做以简要的说明

abuffer busy waitsfree buffer waits这两个参数所标识是dbwr是否够用的问题与IO很大相关的当v$session_wait中的free buffer wait的条目很小或没有的时侯说明你的系统的dbwr进程决对够用不用调整free buffer wait的条目很多你的系统感觉起来一定很慢这时说明你的dbwr已经不够用了它产生的wio已经成为你的数据库性能的瓶颈这时的解决办法如下

a增加写进程同时要调整db_block_lru_latches参数

示例修改或添加如下两个参数

db_writer_processes=

db_block_lru_latches=

a开异步IOIBM这方面简单得多hp则麻烦一些可以与Hp工程师联系

bdb file sequential read指的是顺序读即全表扫描这也是我们应该尽量减少的部分解决方法就是使用索引sql调优同时可以增大db_file_multiblock_read_count这个参数

cdb file scattered read这个参数指的是通过索引来读取同样可以通过增加db_file_multiblock_read_count这个参数来提高性能

dlatch free与栓相关的了需要专门调节

e其他参数可以不特别观注

结篇匆忙之中写下了这篇文章希望能抛砖引玉能为你的Oracle调优实践带来帮助

上一篇:MySQL数据库优化(七)

下一篇:ORACLE的常用知识技巧