이 기사에서는 Oracle에 대한 관련 지식을 제공합니다. 주로 메모리 할당 및 튜닝과 관련된 문제를 소개합니다. Oracle의 메모리는 공유 및 개인 관점에서 시스템 전역 영역과 프로세스 전역 영역으로 나눌 수 있습니다. 모두에게 도움이 되기를 함께 살펴보겠습니다.
추천 튜토리얼: "Oracle Learning Tutorial"
오라클의 메모리는 공유와 프라이빗, 즉 SGA 관점에서 시스템 전역 영역과 프로세스 전역 영역으로 나눌 수 있습니다. 및 PGA(프로세스 글로벌 영역 또는 프라이빗 글로벌 영역)입니다. SGA 영역의 메모리는 전역적으로 공유됩니다. Oracle의 경우 공유 메모리 세그먼트(하나 이상일 수 있음)를 설정해야 합니다. 왜냐하면 Oracle은 UNIX에서는 다중 프로세스이고 Oracle은 단일이기 때문입니다. 프로세스(다중 스레드)이므로 공유 메모리 세그먼트를 설정할 필요가 없습니다. PGA는 프로세스(스레드) 전용 영역입니다. Oracle이 공유 서버 모드(MTS)를 사용하는 경우 PGA의 일부, 즉 UGA가 공유 메모리 Large_pool_size에 배치됩니다.
Oracle 메모리 아키텍처 구성 사진을 게시하면 사진의 표시에 따라 주요 매개변수와 매개변수 이름을 한눈에 볼 수 있습니다.
SGA 부분에 대해서는 sqlplus 쿼리를 통해 확인하세요:
SQL> select * from v$sga; NAME VALUE ---------- -------------------- Fixed Size 454032 Variable Size 109051904 Database Buffers 385875968 Redo Buffers 667648
고정 크기:
오라클은 플랫폼과 버전에 따라 다를 수 있지만 특정 환경에서는 고정된 값으로 SGA의 각 구성 요소에 대한 정보를 저장하며 SGA 구축을 안내하는 영역이라고 볼 수 있습니다.
가변 크기:
shared_pool_size, java_pool_size, Large_pool_size 및 기타 메모리 설정을 포함합니다
데이터베이스 버퍼:
은 데이터 버퍼를 나타냅니다.
8i에서는 db_block_buffer*db_block_size, buffer_pool_keep 및 buffer_pool_recycle의 세 가지 메모리 부분을 포함합니다.
9i에서는 db_cache_size, db_keep_cache_size, db_recycle_cache_size, db_nk_cache_size를 포함합니다.
리두 버퍼:
은 로그 버퍼 log_buffer를 의미합니다. 여기서 추가적으로 주목해야 할 점은 v$parameter, v$sgastat, v$sga에 대한 쿼리 값이 다를 수 있다는 것입니다. v$parameter의 값은 사용자의 이니셜 을 나타냅니다.
초기화 매개변수 파일 v$sgastat에 설정된 값은 오라클에서 실제로 할당한 로그 버퍼 크기입니다(버퍼의 할당 값은 실제로 이산적이며, 블록 내에서 가장 작은 단위로 할당되지 않기 때문입니다),
v$sga에서 쿼리한 값은 Oracle이 로그 버퍼를 할당한 후 로그 버퍼를 보호하기 위해 일부 보호 페이지가 설정된다는 것입니다. 일반적으로 보호 페이지의 크기는 약 11k(약 11k)입니다. 다른 환경에서는 다를 수 있습니다).
2.1 Log_buffer 일반적으로 로그 버퍼 크기 설정에 대한 제안은 그리 많지 않다고 생각합니다. 왜냐하면 LGWR에서 작성한 트리거 조건을 참조하면 일반적으로 3M를 초과하는 것은 그다지 의미가 없다는 것을 알 수 있기 때문입니다. 정식 시스템으로는
이 부분을 먼저 log_buffer=3-5M 크기로 설정한 후 특정 상황에 맞게 조정하는 것을 고려해 볼 수 있습니다. log_buffer는 Redo 로그의 버퍼입니다. 여기서 Redo Log의 Trigger Event(LGWR)를 이해해야 합니다 1. Redo 로그 버퍼의 용량이 1/3에 도달하면 2. 도달, 일반적으로 3 초입니다. 3. 리두 로그 버퍼의 리두 로그 용량이 1M에 도달합니다. 4. DBWn이 버퍼의 데이터를 데이터 파일에 쓰기 전 5. 위의 결론은 다른 말로 표현할 수 있습니다 1.log_buffer의 내용이 1/3이 차면 캐시가 한 번 새로 고쳐집니다. 2. 최대 간격은 3초이며, 캐시는 한 번 새로 고쳐집니다. 3 log_buffer의 데이터가 1M에 도달하면 캐시가 한 번 새로 고쳐집니다. 4 "트랜잭션"이 제출될 때마다 캐시가 새로 고쳐집니다. 2.2 Large_pool_size 대형 버퍼 풀 설정의 경우 MTS를 사용하지 않는 경우 다음을 권장합니다. 20-30M이면 충분합니다. 이 부분은 주로 병렬 질의 시 일부 정보를 저장하는 데 사용되며, 백업 시 RMAN에서 사용할 수도 있습니다.
MTS가 설정되면 UGA 부분이 여기로 옮겨지기 때문에 이 부분의 크기는 서버 프로세스 수와 관련 세션 메모리 매개 변수 설정을 기반으로 종합적으로 고려해야 합니다. 2.3 Java_pool_size
데이터베이스가 JAVA를 사용하지 않는 경우 일반적으로 10-20M 정도만 유지하면 충분하다고 생각합니다. 실제로는 32k 이상일 수도 있지만 데이터베이스 설치 시 구성 요소(예: http 서버)에 따라 다릅니다. 2.4 Shared_pool_size Shared_pool_size 오버헤드는 일반적으로 300M 이내로 유지되어야 합니다. 시스템이 많은 저장 프로시저, 함수 및 패키지를 사용하지 않는 한,
oracle erp와 같은 애플리케이션은 500M 이상에 도달할 수 있습니다. 따라서 우리는 1G 메모리를 갖춘 시스템을 가정하고 다음을 고려할 수 있습니다.
이 매개변수를 100M로 설정하세요. 2G 시스템의 경우 150M로 설정하는 것이 좋습니다. 8G 시스템의 경우 200~300M으로 설정하는 것이 좋습니다. 2.5SGA_MAX_SIZE SGA 영역에는 다양한 버퍼와 메모리가 포함됩니다. pools 이며 대부분은 특정 매개변수를 통해 크기를 지정할 수 있습니다. 그러나 값비싼 자원이기 때문에 시스템의 물리적 메모리 크기는 제한되어 있습니다.
실제 물리적 메모리 크기가 CPU 메모리 주소 지정과 관련될 필요는 없지만(이에 대해서는 나중에 자세히 소개합니다), 가상 메모리를 과도하게 사용하면 페이지 인/아웃이 발생합니다.
시스템 성능에 큰 영향을 미치며 시스템 충돌을 일으킬 수도 있습니다. 따라서 SGA에서 사용하는 가상 메모리의 최대 크기를 제어하는 매개변수가 필요합니다. 이 매개변수는 SGA_MAX_SIZE입니다. 인스턴스가 시작되면
각 메모리 영역은 인스턴스에 필요한 최소 크기만 할당하며, 필요에 따라 크기가 확장되며 전체 크기는 SGA_MAX_SIZE로 제한됩니다. OLTP 시스템의 경우 다음을 참조하세요. 시스템 메모리 SGA_MAX_SIZ E 값 1G ㅋㅋㅋ 4G 2500M 8G 5G 2.6 PRE_PAGE_SGA Oracle 인스턴스가 시작되면 각 메모리 영역 중 가장 작은 크기만 로드됩니다. 그리고 다른 SGA 메모리는 가상 메모리로만 할당되는데,
프로세스가 해당 페이지에 닿았을 때만 물리 메모리에서 교체됩니다. 그러나 일단 인스턴스가 시작되면 모든 SGA가
모두 물리적 메모리에 할당됩니다. 이때 PRE_PAGE_SGA 파라미터를 설정하면 목적을 달성할 수 있다. 이 매개변수의 기본값
은 FALSE입니다. 이는 모든 SGA가 실제 메모리에 배치되지 않음을 의미합니다. TRUE로 설정하면 인스턴스 시작 시 모든 SGA가 물리적 에 배치됩니다.
추억에. 인스턴스를 최대 성능 상태까지 시작할 수 있지만 시작 시간도 더 길어집니다(왜냐하면 모든 SGA를
물리적 메모리에 배치되며 Oracle 프로세스는 모든 SGA 페이지를 터치해야 합니다. 2.7 LOCK_SGA SGA가 페이지 인/아웃 없이 물리적 메모리에 잠겨 있는지 확인하려면 LOCK_SGA 매개변수를 통해 제어할 수 있습니다.
이 매개변수의 기본값은 FALSE입니다. TRUE로 지정하면 모든 SGA가 물리적 메모리에 잠길 수 있습니다. 물론이죠,
일부 시스템은 메모리 잠금을 지원하지 않으므로 이 매개변수는 유효하지 않습니다. 2.8 SGA_TARGET 여기서 소개하고 싶은 것은 Oracle10g에 도입된 매우 중요한 매개변수이다. 10g 이전에는 SGA의 다양한 메모리 영역
의 크기는 해당 매개변수를 통해 지정해야 하며, 그 합은 가 아닐 수 있지만 매개변수에 지정된 크기 값을 초과할 수 없습니다.
SGA의 최대 한도에 도달하지 않았습니다. 또한, 한번 할당되면 각 영역의 메모리는 해당 영역에서만 사용할 수 있으며 서로 공유할 수 없습니다.
SGA에서 가장 중요한 두 가지 메모리 영역인 버퍼 캐시와 공유 풀을 선택하면 인스턴스 성능에 가장 큰 영향을 미칩니다.
하지만 이런 모순이 있습니다. 메모리 리소스가 제한되어 있으면 때로는 캐시할 데이터에 대한 수요가 매우 클 수 있습니다.
버퍼 적중을 개선하려면 버퍼 캐시를 늘려야 합니다. 그러나 제한된 SGA로 인해 공유 풀을 줄이는 등 다른 영역에서만 "강탈"할 수 있습니다.
에 대한 값을 지정하면
当项目的生产环境出现性能问题,我们如何通过判断那些参数需要调整呢? 3.1 检查ORACLE实例的Library Cache命中率: 标准:一般是大于99%
检查方式: 处理措施:
如果Library cache Hit Ratio的值低于99%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小:
3.2 检查ORACLE实例的Data Buffer(数据缓冲区)命中率: 标准:一般是大于90%
检查方式:
处理措施:
如果HIT RATIO的值低于90%,应调高db_cache_size的大小。通过sqlplus连接数据库执行如下命令,
调整db_cache_size的大小
3.3 检查ORACLE实例的Dictionary Cache命中率: 标准:一般是大于95% 检查方式: 处理措施: 如果Data Dictionary Hit Ratio的值低于95%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小: 3.4 检查ORACLE实例的Log Buffer命中率: 标准:一般是小于1% 检查方式: 处理措施: 如果Ratio高于1%,应调高log_buffer的大小。通过sqlplus连接数据库执行如下命令,调整log_buffer的大小: 3.5 检查undo_retention: 标准:undo_retention 的值必须大于max(maxquerylen)的值 检查方式: 处理措施: 如果不满足要求,需要调高undo_retention 的值。通过sqlplus 连接数据库执行如下命令,调整undo_retention 的大小: 注:
32bit 和 64bit 的问题
对于 oracle 来说,存在着 32bit 与 64bit 的问题。这个问题影响到的主要是 SGA 的大小。在 32bit 的数据库下,通常 oracle 只能使用不超过 1.7G 的内存,即使我们拥有 12G 的内存,但是我们却只能使用 1.7G,这是一个莫大的遗憾。假如我们安装 64bit 的数据库,我们就可以使用很大的内存,我们几乎不可能达到上限。但是 64bit 的数据库必须安装在 64bit 的操作系统上,可惜目前 windows 上只能安装 32bit 的数据库,我们通过下面的方式可以查看数据库是 32bit 还是 64bit 그러나 특정 운영 체제에서는 특정 수단이 제공되어 1.7G 이상의 메모리를 사용하여 2G 이상에 도달할 수 있습니다.
추천 튜토리얼: "Oracle Tutorial" 위 내용은 오라클 학습의 메모리 할당 및 튜닝을 요약하고 정리합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!三、oracle 内存调优办法
select 1-(sum(reloads)/sum(pins)) "Library cache Hit Ratio" from v$librarycache;
SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=设定值 scope=spfile;
select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"
from v$sysstat cur, v$sysstat con, v$sysstat phy
where cur.name = 'db block gets'
and con.name = 'consistent gets'
and phy.name = 'physical reads';
SQL>alter system set db_cache_size=设定值 scope=spfile
select 1 - (sum(getmisses) / sum(gets)) "Data Dictionary Hit Ratio"
from v$rowcache;
SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=设定值 scope=spfile;
select (req.value * 5000) / entries.value "Ratio"
from v$sysstat req, v$sysstat entries
where req.name = 'redo log space requests'
and entries.name = 'redo entries';
SQL>alter system set log_buffer=设定值 scope=spfile;
col undo_retention format a30
select value "undo_retention" from v$parameter where name='undo_retention';
select max(maxquerylen) From v$undostat Where begin_time>sysdate-(1/4);
SQL>alter system set undo_retention= 设定值 scope=spfile;