热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一,监控缓冲区的命中率

一,监控缓冲区的命中率1.1oracle的内存结构内存结构(SGAsystemglobalarea)是oracle为一个实例分配的一组共享内存缓冲区,它包含该实例的数据和控制信

, 监控缓冲区的命中率


1.1 oracle的内存结构

内存结构(SGA system global area)oracle为一个实例分配的一组共享内存缓冲区, 它包含该实例的数据和控制信息. SGA在实例启动时被自动分配, 当实例关闭时被收回. 数据库的所有数据操作都通过SGA来进行.

SGA中内存根据存放信息的不同, 可以分为如下几个区域.

数据库缓冲区(Buffer Cache): 存放数据库中数据库块的copy. 它由一组缓冲块组成,这些缓冲块为所有与该实例相连的用户进程共享. 缓冲块的数目由初始化参数DB_Block_buffers确定, 缓冲块的大小由初始化参数DB_BLOCK_SIZE确定. 大的数据块可提高查询速度.

日志缓冲区(Redo Log Buffer): 存放数据操作的更改信息. 它们以日志项(redo entry)的形式存放在日志缓冲区中. 当需要进行数据库恢复时, 日志项用于重构或回滚对数据库所做的变更. 日志缓冲区的大小由初始化参数LOG_BUFFER确定. 大的日志缓冲区可减少日志文件IO的次数. 后台进程LGWR将日志缓冲区中的信息写入磁盘的日志文件中, 可启动ARCH后台进程进行日志信息归档.

共享池(shared pool): 包含用来处理的sql语句信息. 它包含共享sql区和数据字典存储区. 共享sql区包含执行特定的sql语句所用的信息. 数据字典区包含用于存放数据字典, 它为所有用户进程共享.

Cursors: 一些内存指针, 执行待处理的sql语句.

其他信息区: 除了上述几个信息区外, 还包括一些进程之间的通信信息(如封锁信息); 在多线程服务器配置下, 还有一些程序全局区的信息, 请求队列和响应队列等.


1.2 oracle数据库缓冲区的内部机制

Oracle用这一内存来防止不必要的数据块从磁盘重读. 理解oracle数据缓冲区如何操作, 是成功地运用它们调整数据库性能的关键.

oracle8i之前的版本中, 当数据块被从磁盘送进数据缓冲区的时候, 数据块被自动地放置到最近使用过的数据列表的前部. 但是, 这种行为从oracle8i开始就变了: 新数据缓冲区被放置在缓冲区链的中部. 在调节数据库的时候, 你的目标就是为数据缓冲区分配尽量多的内存, 而不会导致数据库服务器在内存里分页. 数据缓冲区每小时的命中率一旦低于90%, 你就应该为数据块缓冲区增加缓冲区.

1.2.1 数据块的存活时间

在调入数据块之后, oracle会不停地跟踪数据块的使用计数(touch count, 也就是说, 这个数据块被用户线程所访问的次数). 如果一个数据块被多次使用, 它就被移动到最近使用过的数据列表的最前面, 这样就确保它会在内存里保存一段较长的时间. 这种新的中点插入技术会确保最常使用的数据块被保留在最近使用过的数据列表的最前面, 因为新的数据块只有在它们被重复使用的时候才会被移动到缓冲区链的最前面.

总而言之, oracle8i通过将新的数据块插入缓冲区的中部, 并根据访问活动调整缓冲区链, 每个数据缓冲区就被分割成两个部分: 热区(hot section), 代表数据缓冲区的最近使用的一半; 冷区(cold section), 代表数据缓冲区的最早使用的一半. 只有那些被反复请求的数据块才会被移近每个缓冲区的热区, 这就让每个数据缓冲区在缓冲常用数据块的时候效率更高.

热区的大小要用下面的隐藏参数来配置:

_db_percent_hot_default

_db_percent_hot_keep

_db_percent_hot_recycle

只有懂得内部机制和希望调节其数据缓冲区行为的有经验人员才应该使用这些参数.

1.2.2 找到热数据块

Oracle8i保留了一个X$BH内部查看表, 用来显示数据缓冲池的相对性能. X$BH查看表有下列数据列:

Tim: 两次使用之间的时间差, _db_aging_touch_time参数相关;

Tch: 使用计数, 它和被使用过_db_aging_hot_criteria次之后从冷区移入热区直接相关.

由于tch数据列用来追踪特定数据块的使用次数, 所以我们就可以编写sql查询来显示缓冲区里的热数据块使用计数大于10的数据块.

SELECT obj object, dbarfil file#, dbablk block#, tch touches
 
FROM x$bh
 
WHERE tch > 10  ORDER BY tch desc;

这项高级查询技术在用于追踪DEFAULT缓冲池里的对象时尤其有用. 一旦定位了热数据块, 你就能够把它从default缓冲池移动到keep缓冲池.


1.3 数据库缓冲区命中率

select name,value
  
from v$sysstat
 
where name in ('physical reads', 'physical reads direct',
        
'physical reads direct (lob)', 'session logical reads');

 

select 1 - ((physical.value - direct.value - lobs.value) / logical.value) "Buffer Cache Hit Ratio"
 
from v$sysstat physical,
       v$sysstat direct,
       v$sysstat lobs,
       v$sysstat logical
 
where physical.name = 'physical reads'
  
and direct.name = 'physical reads direct'
  
and lobs.name = 'physical reads direct (lob)'
  
and logical.name = 'session logical reads';

This v$sysstat view lists system statistics. To find the name of the statistic associated with each statistic number (STATISTIC#), query the V$STATNAME view.


Column

Datatype

Description

STATISTIC#

NUMBER

Statistic number

Note: Statistics numbers are not guaranteed to remain constant from one release to another. Therefore, you should rely on the statistics name rather than its number in your applications.

NAME

VARCHAR2(64)

Statistic name

CLASS

NUMBER

A number representing one or more statistics class. The following class numbers are additive:

  • 1 - User
  • 2 - Redo
  • 4 - Enqueue
  • 8 - Cache
  • 16 - OS
  • 32 - Real Application Clusters
  • 64 - SQL
  • 128 - Debug

VALUE

NUMBER

Statistic value

 


1.4 改进数据库缓冲区的性能

1.4.1 修改data buffer cache的大小

调整database buffer cache的性能最简单的办法就是修改它的大小. SGA45%最合适.

1, DB_BLOCK_SIZE主数据库块大小默认是8K, 在建立完数据库之后就不能改变.

2, DB_CACHE_SIZE(默认缓冲区池)默认48M, 我们主要修改这个参数以提高性能.

Alter system set db_cache_advice = on; 

oracle推荐的统计顾问, 在正常操作半个小时之后可以执行如下查询得到推荐的大小.

select name,size_for_estimate,v$db_cache_advice.ESTD_PHYSICAL_READS from v$db_cache_advice  where block_size='8192' and advice_status='ON';

另外, 我们可以通过下述语句查询哪些对象正缓存在buffer cache, 正使用多少个buffer cache缓冲区.

select do.owner,do.object_name,do.object_type,count(distinct a.BLOCK#) "NUM of buffers"
from v$bh a, dba_objects do
where a.OBJD = do.object_id
 
and do.owner = 'CTL'
group by do.owner,do.object_name,do.object_type

3, 使用多个缓冲池

Alter system set db_cache_size = 300M;

Alter system set db_keep_cache_size = 150M;

Alter system set db_recycle_cache_size = 30M;

将表分配给保持区.

Alter table col_cust storage(buffer_pool keep);

使用下面语句可以查看分配情况.

select owner,segment_type,segment_name,buffer_pool
from dba_segments
where buffer_pool != 'DEFAULT';

使用下面语句可以查看每个buffer pool的大小以及buffer cache的命中率.

select name "Buffer Pool",
      
1 - (physical_reads / (db_block_gets + consistent_gets)) "Buffer Pool Hit Ratio"
 
from v$buffer_pool_statistics
 
order by name;

4, 在内存中缓存表

虽然表可以放在保持区, 但是由于keep pool也是由LRU控制的, 所以当FTS(full table scan), 该表还是被放在LRU的最近最少使用那端. 这样就有可能被移出. 所以我们可以将表变成一个高速缓存区表.

Alter table col_cust cache;

Select owner, table_name from dba_tables where ltrim(cache)=’Y’.


推荐阅读
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
author-avatar
北路新华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有