orcle性能调整

数据库的等待事件,发现前几名是:

log file parallel write

db file scattered read

log file sync

db file sequential read

SQL*Net more data to client

发现前面的4项都是影响到数据库性能的问题:

[@more@] 数据库的等待事件,发现前几名是:

log file parallel write

db file scattered read

log file sync

db file sequential read

SQL*Net more data to client

发现前面的4项都是影响到数据库性能的问题:

log file sync

这个等待时间是指等待oracle的前台的commitrollback操作进程完成,有时候这个等待时间也会包括等待LGWR进程把一个会话事务的日志记录信息从日志缓冲区中写到磁盘上的重做日志文件中。因此当前台进程在等待这个事件的时候,LGWR进程同时也在等待事件log file parallel write

理解什么造成这个等待事件的关键在于:对比这个等待事件和log file parallel write等待事件的平均等待时间

l 如果他们的等待时间差不多,那么就是重做日志文件的I/O引起了这个等待事件,则需要调整重做日志文件的I/O

l 如果log file parallel write等待事件的平均等待时间明显小于log file sync等待事件的等待时间,那么就是一些其他写日志的机制在commitrollback操作时引起的等待,而不是I/O引起的等待。例如重做日志文件的latch竞争,会伴随出现latch free或者LGWR wait for redo copy等待事件

V$SESSION_WAIT中,这个等待事件有3个参数:

P1

代表在日志缓冲区中需要被写入到重做日志文件中的缓存数量,写入的同时会确认事务是否已经被提交,并且保留提交信息到实例意外中断前,因此必须等待LGWRP1数量的缓存写入重做日志文件为止。

P2

无用

P3

无用

如果这个等待事件在整个等待事件中占了比较大的比重,可以从3个方面来进行调整

1. 调整LGWR进程时期具有更好的磁盘I/O吞吐量,例如不要将日志文件放在RAID5的磁盘上

2. 如果存在很多执行时间很短的事务,可以考虑将这些事务合并成一个批量事务以减少提交的次数,因为每次提交都需要确认相关的日志写入重做日志文件,因此使用批量事务来减少提交的次数是一种非常行之有效的减少I/O的方法

3. 产看是否有一些操作可以安全的使用NOLOGGING或者UNRECOVERABLE选项,这样可以减少日志文件的产生

Log file parallel write

这个等待事件出现在党LGWR后台进程从日志缓冲区写日志信息到磁盘上的重做日志文件的时候。只有启用了异步I/O的时候,LGWR进程才会并行写当前日志组内的充作日志文件,否则LGWR指挥循环顺序逐个的写当前日志组重做日志文件。LGWR进程不得不等待当前日志组所有的重做日志文件成员全部写完,因此,决定这个等待事件的等待时间长短的主要因素是重做日志文件所在磁盘的I/O读写速度

如果是当前LGWR进程写的速度不够快导致这个等待事件,可以通过查看一些和重做日志相关的统计值来判定当前的LGWR进程是否效率低下,具体的可以看 redo writes, redo blocks written, redo write time, rdo wastage, redo size等统计值,这些都是和LGWR进程性能直接相关的一些统计值。

V$SESSION_WAIT中,这个等待事件的3个参数:

P1

代表正在被写入的重做日志文件组中的重做日志文件号

P2

代表需要写入重做日志组中每个重做日志文件的重做日志block数量

P3

代表I/O请求次数,需要被写入的block会被分成多次分别请求

如果这个等待事件占用比较多的时间,可以做如下调整

1. 采用UNRECOVERABLE/NOLOGGING操作尽量减少重做日志的产生

2. 在保证不会同时对市重做日志文件的前提下,尽量减少重做日志组中的成员个数,减少每次写重做日志文件的时间

3. 除非在备份情况下,否则不要在江表空间置于热备份的模式下,因为在表空间处于热备的模式下会产生更多的重做日志文件

4. 对于使用LogMinerLogical Standby或者Streams,在能够满足要求功能的前提下,尽量使用最低级别的追加日志以减少重做日志的产生

5. 尽量将同一个日志组内的重做日志文件分散到不同的硬盘上,减少并行写重做日志文件时产生的I/O竞争

6. 不要将重做日志文件置于RAID5的磁盘上,最好放在裸设备上。

7. 如果设置了归档模式,不要将归档日志的目的地设置为存放重做日志的磁盘上,避免引起I/O竞争

关于Log的这2个问题的总结

通过上述对Log2个问题的描述,以及产生的原因,除了Log file sync可能有其他方面的因素引起的(Latch),主要还是磁盘和使用习惯

1. 磁盘由于这些都是写磁盘所引起的,所以只有从减少写磁盘(指数据库本身的角度,和下列提到的用户操作习惯不一样)和加快写磁盘来减少这些等待时间

a) 尽量不要在RAID5的磁盘上保存重做日志文件,RAID5写的速度属于比较慢的

b) 在安全性保证的基础上,减少重做日志组成员的个数

c) 同一个日志组中的不同成员放在不同的磁盘上,加速写的速度。

d) 对可以采用NOLOGGING/UNRECOVERABLE的操作,使用这些选项减少log的产生

e) 有归档的,不要将归档的和在线重做日志放在一个磁盘上

2. 使用习惯如果用户不断的进行commit或者rollback,这样必定引起一次log日志的写操作。因此可以通过一些统计信息判断是否每次的日志的写操作数据量很小,这样通过调节用户的操作,将大量的数据更新合并到一个事务中来,这样增加每次日志的操作量,减少对日志的不断调用,提高LGWR的写的效率。

db file scattered read

这是一个非常常见的等待时间。当oracle从磁盘上读取多个block到不连续的高速缓存区的缓存中就会发生这个等待事件,Oracle一次最多能够读入的block数量由初始化参数DB_FILE_MULTIBLOCK_READ_COUND决定,这个时间一般伴随着全表扫描或者Fast Full Index 扫描一起出现。

V$SESSION_WAIT中,这个等待事件的几个参数:

P1

代表oracle的文件号

P2

代表从这个文件中开始读取的block

P3

代表从这个block开始需要读取的block数量

一般从这个3个参数,就可以回头查询到是在读取数据库的哪个对象,然后分析对这个对象的操作来进行优化Sql语句。

如果这个等待事件占的比重比较厉害,可以通过以下方法来调整

方法一

找出执行全表扫描或者Fast Full index扫描的Sql语句,判断这些扫描是否是必要的,是否导致了比较差的执行计划,进行调整。

oracle9i开始,提供了一个视图V$SQL_PLAN,可以通过它帮助我们找到那些全表扫描或者Fast Full Index扫描的Sql语句:

查找全表扫描的SQL语句

Select sql_text from v$sqltext t, v$sql_plan p

Where t.hash_value=p.hash_value

And p.operation=’TABLE ACCESS’

And p.option=’FULL’

Order by p.hash-value, t.piece;

查找Fast Full index 扫描的Sql语句可以这样;

Select sql_text from v$sqltext t, v$sql_plan p

Where t.hash_value=p.hash_value

And p.operation=’INDEX’

And p.option=’FULL SCAN’

Order by p.hash-value, t.piece;

如果是Oracle8i的数据库,可以通过v$session_event视图中找到关于这个等待事件的进程sid,然后根据这个sid来跟踪相应会话的SQL

Select sid, event from v$session_event

Where event=’db file sequential read’

或者可以通过查看物理读取最多的SQL语句的执行计划,看是否里面包含了全表扫描和Fast Full Index扫描,可以通过以下语句获取物理读取最多的SQL语句

Select sql_text from

Select *from v$sqlarea

Order by disk_reads)

Where rownum<10

方法二:

有时候执行计划很好也会出现多block扫描的情况,这个时候可以通过调整Oracle数据库的多blockI/O,来设置一个合理的DB_FILE_MULTIBLOCK_READ_COUNT,使得尽量满足;

Db_block_size * DB_FILE_MULTIBLOCK_READ_COUNT = max io size of system

这个参数也不是设置的越大越好,设置这个参数之前需要了解一下应用的类型,如果是OLTP类型的,一般来说全表扫描较少,这个时候如果设置了比较大反而会降低数据库的性能,因为CBO在某些情况下会因为多block读取导致COST比较低从而错误的选用了全表扫描。

其他方法

还可以采用对表和索引使用分区、将缓存区的LRU末端的全表扫描和FastFullIndex扫描的block放入到Keep缓存池等方法来进行调节。

db file sequential read

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/34329/viewspace-914986/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/34329/viewspace-914986/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值