7.读书笔记收获不止Oracle之 逻辑体系二 深入与调整
上篇了解了ORACLE的逻辑体系结构及一些基本查看命令。接下深入看看如何调整。
1. BLOCK调整
9i以后的版本中,ORACLE支持用户在新建用户表空间时指定块的大小。这样在多个表空间时,各自的BLOCK大小可能各不相同。
只能是新建自己的用户表空间,不能更改已建好的,更不能更改或调整系统表空间。
查看一个参数:
SQL>show parameter cache_size;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
client_result_cache_size big integer 0
db_16k_cache_size big integer0
db_2k_cache_size biginteger 0
db_32k_cache_size big integer0
db_4k_cache_size biginteger 0
db_8k_cache_size biginteger 0
db_cache_size big integer 0
db_flash_cache_size big integer 0
db_keep_cache_size biginteger 0
db_recycle_cache_size big integer 0
创建一个16KBBLOCK_SIZE的表空间,需要先将db_16k_cache_size 取值设置为非空:
SQL>alter system setdb_16k_cache_size=100m;
SQL>show parameter 16k;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
db_16k_cache_size big integer112M
SQL>create tablespace tbs_toad_16k blocksize 16k datafile'+DATA/ORCL/DATAFILE/tbs_toad_16k_01.dbf' size 100m
autoextend on
extent management local
segment space managementauto;
create tablespace tbs_toad_16k blocksize 16k datafile'+DATA/ORCL/DATAFILE/tbs_toad_16k_01.dbf' size 100m
查看:
SQL> select tablespace_name,block_size from dba_tablespaceswhere tablespace_name in('TBS_TOAD','TBS_TOAD_16K');
TABLESPACE_NAME BLOCK_SIZE
--------------- ----------
TBS_TOAD 8192
TBS_TOAD_16K 16384
2. PCTFREE参数与调整
在只读数据库或者只有插入删除很少更新的数据库环境中,才合适将PCTFREE设置为0。
ORACLE有一个默认的属性,PCTFREE=10,这个参数在数据库层面生效,建表时如果指定PCTFREE为别的值,那这个T表或者说SEGMENT T的所有块的属性就是其他了。
3. EXTENT 尺寸与调整
创建一个每次扩展10M的表空间,如下:
SQL> create tablespace TBS_TOAD_2datafile '+DATA/ORCL/DATAFILE/tbs_toad_2.dbf' size 100m extent management local
uniform size 10m
segment space management auto;
在TBS_TOAD_2上创建一个T2
然后执行查询
SQL> create table t2 (id int) tablespace tbs_toad_2;
SQL> select segment_name,extent_id,tablespace_name,bytes/1024/1024,blocksfrom user_extents where segment_name='T2';
no rows selected
为空。
然后进行插入,然后查看如下:
SQL> insert into t2 select rownum fromdual connect by level<=1000000;
SQL> selectsegment_name,extent_id,tablespace_name,bytes/1024/1024,blocks from user_extentswhere segment_name='T2';
SEGMENT_NAME EXTENT_ID TABLESPACE_NAME BYTES/1024/1024 BLOCKS
--------------- ---------- ------------------------------ ----------
T2 0 TBS_TOAD_2 10 1280
T2 1 TBS_TOAD_2 10 1280
4. 已用和未用的表空间
查看剩余的空间。
SQL> select sum(bytes)/1024/1024 from dba_free_space wheretablespace_name = 'TBS_TOAD';
SUM(BYTES)/1024/1024
--------------------
68
查看总共表空间大小:
SQL> select sum(bytes)/1024/1024 from dba_data_files wheretablespace_name = 'TBS_TOAD';
SUM(BYTES)/1024/1024
--------------------
100
4.1 表空间大小与自动扩展
如果表空间不能自动扩展,用光后,继续插入会引起报错。
可以给表空间增加文件
SQL> alter tablespace tbs_toad adddatafile '+DATA/ORCL/DATAFILE/tbs_toad02.dbf' size 10m;
Tablespace altered.
再次用光就又没了,查看表空间是否支持自动扩展如下:
SQL> select file_name,tablespace_name,autoextensible,bytes/1024/1024from dba_data_files where tablespace_name='TBS_TOAD';
FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME AUT BYTES/1024/1024
--------------- --- ---------------
+DATA/ORCL/DATAFILE/tbs_toad01.dbf
TBS_TOAD NO 100
+DATA/ORCL/DATAFILE/tbs_toad02.dbf
TBS_TOAD NO 10
NO表示不自动扩展。
可以设置自动扩展如下:
SQL> alter database datafile'+DATA/ORCL/DATAFILE/tbs_toad02.dbf' autoextend on;
Database altered.
SQL> select file_name,tablespace_name,autoextensible,bytes/1024/1024from dba_data_files where tablespace_name='TBS_TOAD';
FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME AUT BYTES/1024/1024
--------------- --- ---------------
+DATA/ORCL/DATAFILE/tbs_toad01.dbf
TBS_TOAD NO 100
+DATA/ORCL/DATAFILE/tbs_toad02.dbf
TBS_TOAD YES 10
表空间会自动扩展,当然要小心磁盘空间的使用哦!
也可以在创建表空间的时候,加上autoextend on即可。
删除表空间命令
SQL>drop tablespace TBS_TOAD includingcontents and datafiles;
(PS:windows的数据文件需要自己手动删除)
表空间扩展的大小可以设定参数为next 64k 或者其他, 类似扩展区的 uniform 64k。
还可以限定最大尺寸,参数为 maxsize 5G或者其他.
Extent management local 和 segmentspace management auto
10g以后不需要这两行命令了其实。系统默认是区的本地管理和段的自动管理。
以前区管理是依据数据字典的,导致系统产生大量的递归调用,后来改为通过区上的位图标记来管理区的扩展,性能得以极大提升。10g 以上完全取消了字典管理功能。
5. 回滚表空间
查看,系统自带的回滚表空间,当前使用的回滚表空间
SQL> show parameter undo;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
temp_undo_enabled boolean FALSE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
自己也可以创建一个回滚表空间的,查看我们之前创建的如下:
SQL> select tablespace_name,status fromdba_tablespaces where contents='UNDO';
TABLESPACE_NAME STATUS
--------------- ---------
UNDOTBS1 ONLINE
UNDOTBS2 ONLINE
查看回滚表空间的大小:
SQL> select tablespace_name,sum(bytes)/1024/1024 fromdba_data_files where tablespace_name in ('UNDOTBS1','UNDOTBS2') group bytablespace_name;
TABLESPACE_NAME SUM(BYTES)/1024/1024
--------------- --------------------
UNDOTBS1 95
UNDOTBS2 100
切换回滚表空间可以,如下:
SQL>alter system set undo_tablespace=undotbs2 ;
SQL> show parameter undo
NAME TYPE VALUE
----------------------------------------------- ------------------------------
temp_undo_enabled boolean FALSE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2
数据库的回滚表空间可以有多个,并且自由切换,但是数据库当前使用的回滚表空间只能有一个(RAC会有多个)。
6. 临时表空间新建与切换
临时表空间在数据库中也可以有多个,但是可以被同时使用。
SQL> select tablespace_name,sum(bytes)/1024/1024 fromdba_temp_files group by tablespace_name;
TABLESPACE_NAME SUM(BYTES)/1024/1024
--------------- --------------------
TEMP 60
TEMP_ZOU 100
当前TOAD用户使用的临时表空间时 TEMP_ZOU这个。
SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_userswhere username='TOAD';
DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------------------------------------
TBS_TOAD TEMP_ZOU
SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_userswhere username='SYSTEM';
DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------------------------------------
SYSTEM TEMP
切换使用的临时表空间
SQL> alter user toad temporarytablespace temp;
User altered.
SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_userswhere username='TOAD';
DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------------------------------------
TBS_TOAD TEMP
发生了切换。
多少用户在使用多少临时表空间
SQL> selecttemporary_tablespace,count(*) from dba_users group by temporary_tablespace;
TEMPORARY_TABLESPACE COUNT(*)
------------------------------ ----------
TEMP 43
切换全部临时表空间
SQL>alter database default temporarytablespace temp_toad;
6.1 临时表空间组
临时表空间组可以通过观察数据字典dba_tablespace_groups得到,可以为同一用户的不同SESSION设置不同的临时表空间。
SQL> select *from dba_tablespace_groups;
no rows selected
创建临时表空间组:
SQL> create temporary tablespace temp1_1tempfile '+DATA/ORCL/DATAFILE/temp1_1.dbf' size 10m tablespace grouptemp_group1;
Tablespace created.
SQL> create temporary tablespace temp1_2 tempfile'+DATA/ORCL/DATAFILE/temp1_2.dbf' size 10m tablespace group temp_group1;
Tablespace created.
查看:
SQL> select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------------------------------------
TEMP_GROUP1 TEMP1_1
TEMP_GROUP1 TEMP1_2
移动临时表空间
SQL> alter tablespace temp_zou tablespace group temp_group1;
Tablespace altered.
SQL> select * fromdba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------------------------------------
TEMP_GROUP1 TEMP_ZOU
TEMP_GROUP1 TEMP1_1
TEMP_GROUP1 TEMP1_2
修改TOAD用户的默认临时表空间改为临时表空间组
SQL> alter user toad temporarytablespace temp_group1;
User altered.
查看如下:
SQL> select temporary_tablespace fromdba_users where username='TOAD';
TEMPORARY_TABLESPACE
------------------------------
TEMP_GROUP1
然后使用多个TOAD用户登录进行试验:
每个SESSION都执行如下:
SQL> select a.table_name,b.table_name from all_tablesa,all_tables b order by a.table_name;
不同的SESSION都自动分配到了不同的临时表空间。
查看:
Select username,session_num,tablespace fromv$sort_usage;
可以具体尝试。
临时表空间组可以设置多个。
让数据库在运行时自动从临时表空间组中选择各个临时表空间。在SESSION层面进行IO均衡负载,极大地提升了数据库的性能。