您的位置:首页 > 数据库 > Oracle

Oracle 体系架构--Oracle存储

2012-11-25 15:31 555 查看
一,表空间 tablespace

系统表空间 一定要online

辅助表空间

回滚表空间 一定要online

临时表空间

应用表空间

SELECT * FROM Database_Properties 记录db级的一些参数的缺省值

如缺省表空间,缺省临时表空间,缺省表空间类型

1,创建表空间:

create tablespace ts datafile '/u1/oradata/a/ts.dbf' size 10M

extent management local autoallocate 也可为unifom size 1M

segment space management auto; 也可为manual

创建临时表空间:

create temporary tablespace mytemp tempfile '/u1/oradata/a/mytemp.dbf' size 10M

extent management local uniform size 1M

segment space management manual;

临时表空间只可以用uniform size 和 manual

设定表空间为DB的默认表空间

alter database default tablespace ts

设定某临时表空间为DB的默认表空间

alter database temporary tablespace mytemp

查 Database_Properties发现默认表空间改变
2,临时表空间组 (10g新特性)

用于解决同一用户多个会话表空间争用问题

创建临时表空间组(添加组员):

alter tablespace mytemp tablespace group g1;

alter tablespace mytemp2 tablespace group g1;

产生一个组后产生一个数据字典:SELECT * FROM Dba_Tablespace_Groups 可查

将用户的临时表空间设置成该临时表空间组

alter user scott temporary tablespace g1

将DB默认的临时表空间设为该临时表空间

alter database default temporary tablespace g1;

将临时表空间成员从临时表空间组中删除

alter tablespace mytemp tablespace group '';

v$tempfile 和 dba_temp_files区别?

v$tempfile 在控制文件中,mount状态可读。dba_temp_files在数据文件中

设计这两个功能相近的数据字典是为了恢复方便

3,辅助表空间,

SELECT * FROM v$sysaux_occupants; 可查看辅助表空间有哪些工具

二,数据块

标准块:大小和db_block_size一样的块

非标准块:大小和db_block_size不一样的块

块的大小

块小:每一块中的记录少,并发概率小,但是块比较多,查询速度慢

块大:并发概率大,但是查询速度快

若建表是块大小已经比较大了,事后发现并发量太大如和做?

调整pct_free

复合型:

在内存中每个块的缓冲区大小show parameter cache_size可查

若内存中默认cache_size 为8k有一个表的块大小是16k,则需要在内存中开辟一段空间,器

cache_size为16k。所以 cache中既有8k的空间又有16k的空间,所以称为复合型

alter system set db_32k_cache_size=20M 把32k的cache设置为20M大小

可用dump oracle最底层剖析来分析

三,对象管理

1,表:

分类:

a,normal 对表

b,分区表(方便维护,可以提高性能)

c,索引组织表(IOT)

d,簇表 会减少链接的代价:当需要两个表连接时会生成一个簇表,查询时减少链接代价

表的属性: SELECT * FROM Dba_Tables;

logging :默认写日志,参照表空间的属性

initextent:不指定默认和表空间一致

pct_free

pct_used

ini_trans 事务槽的初始长度

max_trans 事务槽的最大长度

事务槽位于块头下面,当块中记录被修改了事务槽就记录一条,如事务槽最大长度为200

那么当修改第201次记录且之前事务都没结束时会报错

创建表时指定事务槽大小:

create table aaa(a int) max_trans=3;

rowid 逻辑地址:rowid是不存在任何块中,存在索引中

前6位:对象ID(表或索引) Dba_Objects

7-9位:对象所在文件ID Dba_Data_Files v$datafile

10-15位:数据块ID,针对数据文件的

16-18位:块内行号

SELECT dbms_rowid.rowid_object(ROWID) AS obj#,

dbms_rowid.rowid_relative_fno(ROWID) AS file#,

dbms_rowid.rowid_block_number(ROWID) AS block#,

dbms_rowid.rowid_row_number(ROWID) AS row#

FROM scott.dept;

查dept表中所有记录的rowid

rowid 如何映射到块内的行的?

通过查询索引,查到要查信息的rowid。通过rowid的信息查找到块以及块内的行号,若块中那

行记录曾经alter并且新记录没有记录在原来的部位,则原来的部位会记录一个偏移量,从而找到该

记录的新位置

消除碎片的方法:

(1)move (8i,9i)

alter table ts move TBSNAME;

show parameter user_segment 可查

注意:move时全表锁,做完后重建索引

(2)shink (10g新特性)

原理:先排序后释放空间

要先让表有行移动的功能:

alter table test1 enable row movement

排序:

alter table test1 shink space compact

释放空间:

alter table test1 shink space

shink过程不会引发行级触发器,但索引要重建

(3)exp imp 备份恢复技术

面试题:如何清空一个大表?

若delete from 要写日志

若truncate 只在数据字典中标记,并不删除数据释放区间;

所以要删除一个大表应该先回落HWL在系统空闲的时候在释放空间:

所以先truncate

然后系统空闲时 alter table scott.tab1 deallocate unused keep 100m 释放到还剩100m

alter table scott.tab1 deallocate unused keep 0m 完全释放

建表时设定不记录日志:

create table scott.tab as select * from dba.objects nologging;

删除表并释放空间:

truncate table scott.tab1 reuse storage

2,索引:

在无索引的情况下:要查找empno=7369的人的name时,要全表扫描,即使找到一个还是要继

续扫描全表

有索引的情况下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: