查看: 1318|回复: 0

[Oracle数据库] 详解 SGA 与实例优化(部分)

发表于 2018-3-8 08:00:02
  1. SGA的组成图
  2. -----------------------------------------------------------------------------------------------------------------------
  3. | SGA |
  4. | |
  5. | |--------------------------| |--------------------------| |------------------------| |
  6. | | | | | | | |
  7. | | 数据库缓冲区 | | 重做日志缓冲区 | | 共享池 | |
  8. | | database bufferr cache | | redo log buffer | | shared pool | |
  9. | | | | | | | |
  10. | | | | | | | |
  11. | |--------------------------| |--------------------------| |------------------------| |
  12. | |
  13. | |
  14. | |--------------------------| |--------------------------| |------------------------| |
  15. | | | | | | | |
  16. | | Java池 | | 大池 | | 流池 | |
  17. | | Java pool | | large pool | | stream pool | |
  18. | | | | | | | |
  19. | |--------------------------| |--------------------------| |------------------------| |
  20. | |
  21. -----------------------------------------------------------------------------------------------------------------------
  22. 数据库缓冲区 :该区域存放用户从数据库中读取的数据
  23. 当用户查找数据库时会首先在数据库缓存中搜索,如果没有才会读取数据库文件。
  24. 所以该区域不能设置的过小,不然频繁的读取数据文件会增大查询时间,因为I/O是耗时的行为
  25. 重做日志缓冲区 :该缓冲区放置用户改变的数据,所有变化了的数据和回滚需要的数据都暂时保存
  26. 共享池 :包括数据字典高速缓存和库高速缓存,库高速缓存存放Oracle解析的SQL语句、PL/SQL过程、包以及各种控制结构,如锁、库缓冲句柄
  27. 数据字典高速缓存保存执行SQL语句所需的各种数据字典定义如表和列的定义,用户访问表的权限等。
  28. Java池 :执行java代码的区域
  29. 大池 :该内存区提供大型的内存分配,在共享服务器连接模式下提供会话区,在使用RMAN备份时也使用该内存区作为磁盘I/O的数据缓冲区
  30. 流池 :该区域称为流内存,是为Oracle流专用的内存池,流是Oracle数据库中的一个数据共享,其大小可以通过参数streams_pool_size
  31. SGA中的内存参数可以动态修改,但是总的内存大小受到参数SGA_MAX_SIZE的限制。
  32. 优化重做日志缓冲区
  33. 重做日志缓冲区是使一段临时存储重做数据的内存区,所有变化的数据前项和修改后的数据都保存在重做日志缓冲区中,由LGWR进程负责写入重做日志文件。
  34. 在优化时,需要考虑该内存区的大小,以及LGWR的写速度和重做日志文件所在磁盘的争用
  35. LGWR把重做日志缓冲区写入重做日志文件的条件
  36. 1.每隔3秒钟
  37. 2.事务被提交时
  38. 3.当重做日志缓冲区的记录的变化的数据量超过1MB字节
  39. 4.当重做数据的大小为中做日志缓冲区大小的1/3时,
  40. 当重做数据量达到其容量的1/3这个阀值时,LGWR进程会写出重做日志缓冲区的数据,而剩下的2/3的数据可以提供其它服务器进程使用。
  41. 5.检查点发生时
  42. 6.当DBWR进程将数据库高速缓冲区的数据写到数据文件前
  43. 查看重做日志缓冲区的尺寸
  44. show parameter log_buffer;
  45. 重做日志缓冲区相关的等待事件
  46. 如果需呀优化重做日志缓冲区,必须首先确认发生了与重做日志缓冲区相关的等待时间,否则不应该随便调整重做日志缓冲区的尺寸
  47. 通过WAIT视图和EXENT视图,确认等待时间以及该事件涉及的文件和会话
  48. 通过数据字典视图查看会话等待事件
  49. col event for a35
  50. col username for a10
  51. select sw.sid,s.username,sw.event,sw.wait_time
  52. from v$session s,v$session_wait sw
  53. where sw.event not like 'rdbms%'
  54. and sw.sid=s.sid
  55. order by sw.wait_time,sw.event
  56. 1.Log buffer space :该事件说明缺少重做日志的缓冲区空间,
  57. 造成该等待事件的原因一般是服务器进程写入重做日志缓冲区的速度高于LGWR重做日志缓冲区写出的速度,
  58. 也有可能是重做日志文件所在磁盘设备速度慢或者存在设备争用,造成LGWR进程无法即使将重做日志缓冲区的重做数据写入到重做日志文件
  59. 优化方法:调整重做日志缓冲区,
  60. 或者将重做日志数据文件迁移到高速磁盘
  61. 或者为了解决争用,将重做日志文件和数据库文件以及归档文件放在不同的磁盘上
  62. 2.log file parallel write :该事件的含义是日志文件并行写等待,是在将重做日志缓冲区的重做数据写入磁盘引起的等待事件。
  63. 造成该事件的原因一般是连接重做日志文件所在的设备速度慢或者存在磁盘争用
  64. 优化方法:将重做日志文件和数据库数据文件以及归档文件放在不同的磁盘上。以及将重做日志文件放置在告诉盘上。
  65. 3.log file single write :该等待事件仅与写日志文件头块有关,表示检测点中的等待
  66. log file switch(archiving needed)该等待事件的含义是日志文件切换等待。
  67. 对于处于归档模式的数据库而言,当日志组写满后,在日志切换时需要覆盖先前的日志,
  68. 而该日志需要归档进程写入归档文件,由于写入归档文件需要时间,而LGWR进程需要将重做日志缓冲区的数据写入重做日志文件,而归档未完成需要等待,在此期间
  69. 就产生了log file switch事件,该等待事件的原因一般是I/O问题、ARCH归档进程跟不上LGWR日志写进程的速度或这日志组太少引起的
  70. 优化方法:启用多个归档ARCH进程或I/O从进程(slave processe ),
  71. 将归档的文件和数据文件或重做日志文件防止在不同的位置,减少磁盘争用以减少ARCH归档进程的归档事件,
  72. 或者增加重做日志组
  73. 4.log file switch(checkpoint incomplete):该事件是由日志切换太频繁引起的,由于频繁地切换重做日志文件,造成检查点的排队。
  74. 发生该等待事件的原因一般是重做日志缓冲区空间太小或者重做日志组太少。
  75. 优化方法:增加重做日志组或者增加重做日志缓冲区尺寸。
  76. 5.log file sync:当用户提交时,重做日志缓冲区中的数据会一次全部写到重做日志文件中,此时发生的LGWR的写出等待就是log file sync等待。
  77. 造成该等待的原因一般是放置联机重做日志文件的磁盘组存在争用或者磁盘速度慢。
  78. 优化方法:将重做日志文件和数据文件或归档重做日志文件放置在不同磁盘上,以减少数据库中的各种文件之间的I/O争用,
  79. 同时可以把重做日志文件放在高速磁盘上,以减少重做数据写入重做日志文件的时间。
  80. 6.Latch free:该等待事件的含义是当前的服务器进程需要某个闩锁,比如等待共享池的库高速缓存闩锁。
  81. 如果发生该等待事件也可以通过数据字典V$Latch查看相关的闩锁命中率。
  82. 查询与闩锁LATCH相关的信息
  83. select latch#,name,gets,misses,1-(misses/(gets+misses)) "get rate"
  84. from v$latch
  85. where misses>1;
复制代码




回复

使用道具 举报