ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle优化

2021-11-09 17:02:46  阅读:147  来源: 互联网

标签:11 target PGA sga oracle SQL Oracle 优化


核心:减少IO——只要将大多数磁盘操作转换成内存操作,数据库系统的效率就会显著提高。

 


一、内存优化

1.1 SGA

1. sga_max_size:分配给SGA的最大内存。

SGA不能太大,一般设置可以设置为当前内存大小即可。静态参数,改后重启生效。

SQL> show parameter sga_max_size;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 3200M

SQL> alter system set sga_max_size=3500M scope=spfile;
System altered.

SQL> shutdown immediate;

[遇到报错]:

SQL> startup;
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 3674210304 cannot be set to more than MEMORY_TARGET 3355443200.

[原因]:修改sga_max_size=3500M之后,停机重启报错,因为设定的值过大,无法启动,甚至无法startup nomount;

[解决方法]:找到参数文件目录,由于spfile是二进制的无法直接修改,需要从动态文件生成一个静态文件,修改sga_max_size的值,并通过pfile启动数据库

① 创建一个pfile文件

SQL> create pfile from spfile;

② 修改pfile中的值

[oracle@test1 dbs]$ pwd
/u01/app/oracle/product/11.2.0/db_1/dbs

[oracle@test1 dbs]$ vim initorcl.ora 
...
*.sga_max_size=3000016000
...

③ 通过pfile启动Oracle

SQL> conn / as sysdba;
Connected to an idle instance.
SQL> startup pfile=/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
ORACLE instance started.

④ 备份或删除原有的spfile,通过pfile生成新的spfile

[oracle@test1 dbs]$ mv spfileorcl.ora spfileorcl.ora.bak

SQL> create spfile from pfile;

 

2. lock_sga:将SGA锁定在物理内存,不使用swap。静态参数,改后重启生效。

SQL> show parameter lock_sga;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE

SQL> alter system set lock_sga=true scope=spfile;

 

3. sga_target:自动共享内存管理。

指定了SGA可以使用的最大内存大小,而SGA中各个内存的大小由Oracle自行控制,不需要人为指定。Oracle可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,并且控制他们之和在SGA_TARGET指定的值之内。一旦给SGA_TARGET指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。

SQL> show parameter sga_target;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 0

SQL> alter system set sga_target=3200m;

 

 

1.2 PGA

PGA优化就是将大规模数据排序放在PGA里运行。

1. PGA排序区自动管理

SQL> select name,value,isdefault 
from v$parameter 
where name in ('pga_aggregate_target','workarea_size_policy');

NAME                                  VALUE                    ISDEFAULT
------------------------------------------------------------------------------
pga_aggregate_target                      0                         TRUE
workarea_size_policy                   AUTO                         TRUE

pga_aggregate_target:定义了实例中所有服务器进程的PGA总和。

workarea_size_policy:是否为排序自动管理。

 

2. 查看PGA状态

SQL> select name,round(value/1024/1204,2) as "value(MB)" from v$pgastat 
where name in ('aggregate PGA target parameter','aggregate PGA auto target','cache hit percentage'); -- 三个重要参数 NAME value(MB) ------------------------------------------------ aggregate PGA target parameter 1088.64 --当前系统PGA总和 aggregate PGA auto target 864.37 -- 排序区分配的内存大小 cache hit percentage 0 -- 排序区完成比例

 

3. 调整PGA内存大小

alter system set PGA_aggregate_target=1500M
show parameter pga_aggregate_target;

 

二、IO优化

2.1 文件层面

1. 给I/O带来很大负荷的是重做日志文件、数据文件、索引文件的读写。

2. 数据文件与重做日志文件尽量放在不同的磁盘上;

  原因:CKPT、DBWn、SERVER三大进程都对数据文件进行操作; LGWR、ARCn、SERVER三大进程都对重做日志文件进行操作; 若两个文件存放在同一磁盘上,会导致两个文件的I/O竞争非常大。

3. 表和索引分别存放在不同的表空间中,因为一个表和表上的索引是明显存在竞争的。

 

2.2数据文件IO信息

select a.file# "文件号",NAME "文件名",phyblkrd "读的物理块数",phyblkwrt "写的物理块数",readtim "读时间",writetim "写时间" from v$filestat a join v$datafile b
on a.FILE#=b.FILE#;

文件号           文件名                                读的物理块数   写的物理块数    读时间     写时间
-----------------------------------------------------------------------------------------------------
1      /u01/app/oracle/oradata/orcl/system01.dbf        19369      15060        119        906
2      /u01/app/oracle/oradata/orcl/sysaux01.dbf        69371     241200        280      13425
3      /u01/app/oracle/oradata/orcl/undotbs01.dbf       27206      78275         69       3092
4      /u01/app/oracle/oradata/orcl/users01.dbf          5272          0          7          0
5      /u01/app/oracle/oradata/orcl/example01.dbf         582          0          5          0
6      /u01/app/oracle/oradata/orcl/test01.dbf              2          0          0          0
7      /u01/app/oracle/oradata/orcl/undotbs02.dbf          22          0          0          0
8      /u01/app/oracle/oradata/orcl/testtbs01.dbf           2          0          0          0

8 rows selected

 

2.3 重做日志优化

redo-log不能设置太小,太小会造成日志组的频繁切。切换时还要触发CKPT。CKPT还要读写数据文件和控制文件。因此会产生大量的输入输出。

查看redo-log的切换历史

select sequence#,to_char(first_time,'RR-MM-DD HH:MM:SS') "Date Time" from v$log_history;
 
SEQUENCE#      Date Time
......
405            21-11-08 10:11:54
406            21-11-08 10:11:57
407            21-11-08 11:11:15
408            21-11-09 02:11:36
409            21-11-09 07:11:03
410            21-11-09 11:11:46

增加redo-log大小

ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/oracle/oradata/orcl/redo06.log') SIZE 500M;

 

标签:11,target,PGA,sga,oracle,SQL,Oracle,优化
来源: https://www.cnblogs.com/lotoblog/p/15529784.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有