13.笔记:监视与管理存储结构

1.联机与归档重做日志文件的存储
重做日志具有双重目的:对于在实例失败事件中防止数据库讹误来说,联机日志文件是必不可少的;
对于在介质失败事件中的恢复来说,归档日志文件是必需的。

1.1 磁盘I/0与联机重做日志文件
提交过程表明:在提交时,LGWR进程会将内存中的重做数据写至磁盘上的联机重做日志文件。
LGWR进程决定性能的方面为:某位用户执行提交语句时,指定会话在LGWR进程将日志缓冲区的内容转储至磁盘之前将被挂起。
如果联机日志文件组的两个成员位于相同的物理磁盘设备上,那么只能执行顺序的写操作:先写一个成员,然后再写另一个成员。
(1)联机日志文件组的复用副本应位于不同的物理磁盘上。以保证不同的副本是并行写到磁盘上的。(最重要)
(2)如果可能的话,就不要将联机日志文件定位在与数据文件相同的设备上。(次重要)
(3)磁盘条带化

1.2 日志切换与性能
ORACLE提供的一个保证是:如果实例崩溃,那么联机日志文件中始终存在足够的重做数据。因此,DBWn进程必须在每次切换时将
脏缓冲区从数据库高速缓存区中写出,从而将检查点位置前移至相应日志切换发生的时间点。这种操作的副作用是:频繁的日志切换会导致
DBWn进程进行超出其正常范围的更多磁盘I/0操作。
理想的情况是:DBWn进程的写操作应当由恢复时的需求驱动(FAST_START_MTTR_TARGET),而不是由日志切换驱动。
Database Control中的重做日志顾问程序能够给出建议的重做日志文件大小。

1.3 归档日志文件与性能
联机重做日志文件被填满时必须被复制至归档重做日志文件。某个联机日志在未归档之前不可能被重写。
如果日志写入进程快于归档日志,当日志写入进程要重写的重做日志还没有归档。实例将被挂起。
为了最小化日志文件进行归档的影响:
(1)首先不能将归档日志和联机日志文件定位在相同的设备上。
(2)其次,启动的归档器进程数应当始终不少于归档目的地数。(LOG_ARCHIVE_MAX_PROCESSES)
(3)如果仍然存在问题,那么就添加更多的联机日志文件组。

2.空间错误与可恢复语句
在出现某条语句遇到空间问题的事件中,默认的行为是:这条语句被回滚,并且会向相应的会话返回一条错误消息。
这种行为可以被修改为将指定的语句挂起,从而使DBA有机会解决问题。
alter session enable resumable;
alter session enable resumable timeout 60 name 'Ar archive';
实例级别启动挂起:RESUMABLE_TIMEOUT
某个会话被挂起时会引发一个系统事件,即AFTER SUSPEND事件,该事件能够激发一个数据库触发器suspend_message,可以改写这个触发器。

3.练习:使用可恢复语句
会话1:
CREATE TABLESPACE small datafile '/home/oracle/db/small.dbf' size 1m;
create table toobig (c1 char(1000)) tablespace small;

alter session enable resumable;
begin
for i in 1..1000 loop
insert into toobig values('a');
end loop;
commit;
end ;
--报错

会话2:
select * from dba_resumable;
alter tablespace small add datafile '/home/oracle/db/small2.dbf' size 10m;

4.监控空间使用的告警
告警系统由MMON后台进程启用。
DBA_FREE_SPACE视图中,回收站对象所占有的表空间被报告为"FREE(空闲)"
告警可以通过多种方式显示。例如,我们可以配置数据库在引发某个告警时发送电子邮件或页面。引发告警时,默认的行为只是通过Database Control报告相应的告警。
在DBA_OUTSTANDING_ALERTS视图中,我们也可以查看告警。

5.监视与管理段的大小
在记录不断地被插入某个表时,ORACLE会根据需要为这个表分配更多的区间。删除记录时,这些区间不会被重新分配。
这个机制会导致空间的浪费、性能的退化。

5.1估计段的大小
使用Database Control创建表或索引时,顾问程序能够估计表或索引所需的空间大小。
5.2缩小表段
高水印(high water mark,简写为HWM)是针对最近使用数据块的段中的一个标记。创建表时,HWM被设置在段的起始位置。在记录不断地被插入某个表时,HWM会被上推。
在删除记录时,段内的空间会被释放,但是段本身保持为其分配的空间,同时HWM并不会移动。
一次完整的表扫描操作需要耗费数小时,如果删除所有记录,那么再次进行一次扫描需要多长时间呢?这个时间与先前的时间一样长。
alter table ... enable row movement;
ALTER TABLE ... SHRINK SPACE [CASCADE/COMPACT];--CASCADE选项将缩小表及其索引
段缩小操作只能被应用于堆结构表,这种表必须位于使用自动段空间管理(automatic segment space management,简写为ASSM)的表空间内。
堆结构表包括:标准表、分区表、物化视图容器表以及物化视图日志表。
下列类型则不能缩小:
群集表
具有LONG类型列的表
LOB段
具有基于提交的物化视图的表(因为禁用了触发器)
具有ROWID物化视图的表(因为ROWID发生了变化)
IOT映射表与IOT溢出段
索引基于函数的表
未启用记录转移的堆表

5.3缩小索引段
在对索引列应用DML时,索引由于被浪费的空间而变得低效。
ORACLE的B*Tree索引的维护方式为:一旦在数据块中为某个索引条目分配了空间,那么即使这个索引条目涉及的记录已被删除,为其指派的空间仍然会保留。
--分析索引是否浪费了空间
analyze index ind_1 validate structure;
select lf_rows_len,del_lf_rows_len from index_stats;
--索引缩小:释放索引内的空间,但是确实不能向空间间返回任何空间
alter index ind_1 shrink space;

alter index ind_1 coalesce;

5.4重构索引段
alter index ... rebuild [online];--online:在重构索引期间,新旧索引会同时存在
如果具有足够的存储空间,那么最好重构索引,这种方法比删除和重新创建索引要好。创建索引需要排序,但是重构可以使用旧索引中已经按顺序排列的键。

5.5监视索引的使用
alter index reg_id_pk monitoring usage;
select index_name,table_name,used from v$object_usage;

alter index reg_id_pk nomonitoring usage;

6.交替的表存储结构
在ORACLE数据库中,标准的表类型为堆表。堆(heap)由若干以随机顺序排列、长度可变的记录组成,并且不存在物理存储结构。
--创建堆表:实际上默认采用的就是堆表
create table heap_tab (c1 date) organization heap;
高级的表结构:索引组织表(index-organized table,简写为IOT)、索引群集、散列群集、有序散列群集。
使用高级表类型的好处很多,我们必须全面理解这些类型。如果选择了不适当的结构,那么就将导致严重的灾难。
6.1索引组织表
一个IOT是一个B*Tree索引,但是其叶块包含索引键与记录的其余部分。记录本身被存储在索引中,并且不存在任何堆表。
访问IOT中记录的速度快于通过索引访问堆表的速度。由于只需要一个段(而不是两个段),因此IOT也能节省空间。
索引的REBUILD ONLINE 功能可以应用于整个IOT表。
对于IOT,MOVE TABLE ... ONLINE,已被实现为REBUILD ONLINE。
alter table tb_objects move TABLESPACE TS2 online;--MOVE到新TABLESPACE会重新组织表。测试发现,MOVE不改变溢出段。

IOT存在下列限制:
(1)必须有一个主键约束
(2)IOT不能是群集表
(3)不能对IOT应用复合分区
(4)IOT中不能定义类型为LONG的列
可以在IOT上创建次索引,但是可能并不十分有效。

--创表语句
create table emp_iot
(emp_no number,
emp_name varchar2(20),
emp_dept number,
emp_address varchar2(500),
emp_hist varchar2(1000),
constraint emp_pk primary key(emp_no))
organization index
including emp_name tablespace ts1
overflow tablespace ts_over;--溢出段


--例子start---------------------------------------------------------------------------
create table tb_objects
(
OBJECT_NAME VARCHAR2(128),
SUBOBJECT_NAME VARCHAR2(30) ,
OBJECT_ID NUMBER ,
DATA_OBJECT_ID NUMBER ,
OBJECT_TYPE VARCHAR2(19) ,
CREATED DATE ,
LAST_DDL_TIME DATE ,
TIMESTAMP VARCHAR2(19) ,
STATUS VARCHAR2(7) ,
TEMPORARY VARCHAR2(1) ,
GENERATED VARCHAR2(1) ,
SECONDARY VARCHAR2(1),
constraint obj_pk primary key(object_id)
)
organization index
including object_name tablespace ts1
overflow tablespace ts_over;

insert into tb_objects
select * from user_objects;
commit;

select * from user_indexes i where i.index_name='OBJ_PK';
SELECT * FROM USER_SEGMENTS S WHERE S.tablespace_name IN ('TS1','TS_OVER')
--例子end---------------------------------------------------------------------------

IOT涉及的最后一个主题是次位图索引的使用?
--映射表:alter table emp_iot move mapping table;

如果您的表经常需要按主键进行排序,那么可以最大限度地快速获得查询的返回结果。在这种情况下,Oracle会忽略排序操作。
IOT可以像堆组织表一样进行分区。

create table woodscrew_orders (
ord_id number not null,
ord_date date,
cust_id number not null,
scr_id number not null,
ord_cnt number,
warehouse_id number not null,
region varchar2(20),
constraint pk_wdscr_orders primary key (ord_id,ord_date))
organization index
including ord_date pctthreshold 20
overflow tablespace wd_scr_overflow
partition by range (ord_date) ...

;





6.2索引群集表

--练习
create cluster staff_clust(sno number) index;
create index staff_idx on cluster staff_clust;
--
create table staff(
sno number,
sname varchar2(20),
constraint staff_pk primary key(sno)
)
cluster staff_clust (sno);

create table address_lines
(
sno number,
lno number,
ltext varchar2(100)
)
cluster staff_clust(sno);

--插入数据
DECLARE
i NUMBER;
BEGIN
FOR i in 1..5000 loop
insert into staff values(i,to_char(i)||'a ...b');
insert into address_lines values(i,i,'address1');
insert into address_lines values(i,i,'address2');
end loop;
commit;
END;

--分析表
exec dbms_stats.gather_table_stats(ownname => 'SYSTEM',tabname => 'STAFF');
exec dbms_stats.gather_table_stats(ownname => 'SYSTEM',tabname => 'ADDRESS_LINES');


--逻辑结构
select * from user_tables t where T.CLUSTER_NAME IS NOT NULL;

--物理存储结构
select * from user_segments s where s.segment_name like 'STAFF%';

--注:USER_TABLES中ADDRESS_LINES 与STAFF的数据块都是5001,user_segments中STAFF_CLUST的数据块数为5120,说明这两张表在cluster中共用数据块。

select
t2.sno,t2.ltext
from staff t1
left join address_lines t2 on(t1.sno=t2.sno)
where t1.sno=2000;

一个索引群集(index cluster)是被存储在物理段中的一组表。所有表必须通过一个公用键进行链接。通常,索引群集被用于反规格化有外键关系的表。

6.3散列群集表
create cluster staff_clust2(sno number) hashkeys 10000;

create table staff2(
sno number,
sname varchar2(20),
constraint staff2_pk primary key(sno)
)
cluster staff_clust (sno);

--散列群集(hash cluster)也可以用于反规格化表,但是在许多情况下,散列群集用于单一的表。
--如果使用基于主键的等式,那么散列群集可以提供最快的数据检索。范围搜索是非常不利的。

6.4有序散列群集表
create cluster addr_clust(sno number,lno number sort) hashkeys 10000 single table;--使用single table子句能够使ORACLE更有效地构造群集。

create table address_lines
(
sno number,
lno number,
ltext varchar2(100)
)
cluster staff_clust(sno,lno);
--使用有序散列群集,那么就不必进行排序
--使用ORDER BY 子句,实际上并不会进行任何排序。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7901922/viewspace-1059675/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7901922/viewspace-1059675/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值