-
Notifications
You must be signed in to change notification settings - Fork 28
Expand file tree
/
Copy pathF-DBA的日常工作-02-tuning.txt
More file actions
193 lines (155 loc) · 6.05 KB
/
F-DBA的日常工作-02-tuning.txt
File metadata and controls
193 lines (155 loc) · 6.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
内存管理风格的变化
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oracle 8i
pga --> manual
bitmap_merge_area_size=1048576
create_bitmap_area_size=8388608
hash_area_size=131072
sort_area_size=65536
sga --> manual 内存组件的尺寸如果需要改变必须重起实例
shared_pool_size (共享池大小)
db_block_buffers (数据库缓冲区高速缓存)= 10000 (10000*db_block_size)
java_pool_size (java池)
large_pool_size (大池)
log_buffer (日志缓冲区高速缓存)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oracle 9i
pga --> auto
workarea_size_policy= AUTO | manual (排序区的管理)
pga_aggregate_target=200m
sga --> 半自动
sga_max_size (oracle启动之后sga使用物理内存的上限)
shared_pool_size (共享池大小)
db_cache_size (数据库缓冲区高速缓存)
java_pool_size (java池)
large_pool_size (大池)
*log_buffer (日志缓冲区高速缓存)
log_buffer之外的4个内存池,在不重新启动数据库的情况下大小可调整!尺寸之和不能超过sga_max_size!
管理员使用命令 alter system set .....; 收缩和扩张内存池!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oracle 10g
pga --> auto
workarea_size_policy= AUTO | manual (排序区的管理)
pga_aggregate_target=200m
sga --> auto
sga_max_size (oracle启动之后sga使用物理内存的上限)
sga_target = 20G (自动管理的上限)
shared_pool_size (共享池大小)
db_cache_size (数据库缓冲区高速缓存)
java_pool_size (java池)
large_pool_size (大池)
streams_pool_size (流池)
*log_buffer (日志缓冲区高速缓存)
引入3个监视内存工作状态的进程
MMAN:内存管理
MMON:内存监控
MMNL:内存指示灯
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oracle 11g : PGA+SGA统一自动管理
memory_max_target :PGA+SGA上限
memory_target :PGA+SGA自动上限
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SGA自动管理:
sga_max_size --> sga的上限
sga_target --> sga自动管理的上限
col name for a30
col value for a30
select name,value from v$parameter
where name in
('log_buffer',
'db_cache_size',
'shared_pool_size',
'large_pool_size',
'java_pool_size',
'streams_pool_size');
*SGA自动管理模式下,我们可以控制内存组件收缩的下限!
db_cache_size=200m 收缩的下限为200m
shared_pool_size=400m 收缩的下限为400m
内存页面预分配:
SQL> alter system set pre_page_sga=true scope=spfile;
将SGA锁定在物理内存:
SQL> alter system set lock_sga=true scope=spfile;
vi /etc/security/limits.conf
-----------------------------
oracle soft nporc 2047
oracle hard nporc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft memlock unlimited
oracle hard memlock unlimited
查看SGA分配建议
SQL> select SGA_SIZE,ESTD_DB_TIME from v$sga_target_advice;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SGA手工管理:
sga_target=0
调整共享池:
查找共享池中的sql语句
select sql_text from v$sqlarea where sql_text like 'select * from scott.%';
避免使用硬编码的字符条件:相似sql是垃圾
select substr(sql_text,1,30),count(*) from v$sqlarea having count(*)>10 group by substr(sql_text,1,30);
查看共享池大小
show parameter shared_pool
shared_pool_reserved_size=20M (共享池保留区大小)
shared_pool_size=400M(共享池大小)
SQL> select ksppinm,indx from x$ksppi where ksppinm like '%reserved%';
KSPPINM INDX
-------------------------------- ----------
_shared_pool_reserved_min_alloc 182
SQL> select KSPPSTDVL from x$ksppcv where indx=182;
KSPPSTDVL
---------
4400
查看共享池调整建议
SQL> select SHARED_POOL_SIZE_FOR_ESTIMATE,ESTD_LC_MEMORY_OBJECT_HITS from v$shared_pool_advice;
清空共享池:
alter system flush shared_pool;
create or replace procedure p1
is
begin
null;
end;
/
手工将代码缓存到共享池 : LRU算法不释放keep状态的代码!
exec dbms_shared_pool.keep('P1');
select owner,name,type,kept
from v$db_object_cache
where type IN
('PACKAGE', 'PROCEDURE', 'TRIGGER', 'PACKAGE BODY');
exec dbms_shared_pool.unkeep('P1');
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
调整数据库缓冲区高速缓存:
SQL> show parameter db_cache_size
NAME TYPE VALUE
------------------------------------ ----------- -----
db_cache_size big integer 584M
查看数据库缓冲区高速缓存中的内容:
SQL> select data_object_id from user_objects where object_name='EMP';
DATA_OBJECT_ID
--------------
87108
SQL> select OBJD,FILE#,BLOCK# from v$bh where objd=87108;
OBJD FILE# BLOCK#
---------- ---------- ----------
87108 4 151
清空数据库缓冲区高速缓:
alter system flush buffer_cache;
SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
SET AUTOT ON
SET AUTOT TRACE
SET AUTOT TRACE EXP
SET AUTOT TRACE STAT
SET AUTOT OFF
使用10046跟踪sql行为:
SQL> grant alter session to scott;
SQL> alter session set events '10046 trace name context forever ,level 12';
SQL> select * from emp;
SQL> alter session set events '10046 trace name context off';
tkprof db01_ora_4371.trc 1.txt
缓冲池的命中率:
SELECT name, 1 - (physical_reads /
(db_block_gets + consistent_gets)) "HIT_RATIO"
FROM v$buffer_pool_statistics
WHERE db_block_gets + consistent_gets > 0;
多缓冲池:
SQL> @?/rdbms/admin/awrrpti.sql
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~