Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92603677
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-20 21:25:16

   文章来源:    

 

  自动的 Segment Advisor

  您如何知道哪些段在最高使用标记下具有大量可用空间,并能从重新组织中受益?

  可以使用 Oracle 数据库 10g 中提供的 Oracle Enterprise Manager 界面指定特定的表空间来发现可能的符合要求的段,但如果您的数据库有几百个表空间,则不可能每天执行该操作。即使您能做,但也不是每个表空间都有需要重新组织的段的。因此,如果有一个自动工具可以提前扫描这些段并报告需要重新组织的段岂不很好?

  在 Oracle 数据库 10g 第 2 版中,所附带的程序包 DBMS_SPACE 提供了该功能。内置函数 ASA_RECOMMENDATIONS 显示了段;由于这是一个管道函数,因此必须按如下所示使用它:
select * from table (dbms_space.asa_recommendations()); 
  由于列数较多,因此看清楚输出不太容易。以下只是一个以垂直格式显示的记录。
TABLESPACE_NAME       :USERS 
SEGMENT_OWNER         :ARUP 
SEGMENT_NAME          :ACCOUNTS 
SEGMENT_TYPE          :TABLE PARTITION 
PARTITION_NAME        :P7 
ALLOCATED_SPACE       : 0 
USED_SPACE            : 0 
RECLAIMABLE_SPACE     : 0 
CHAIN_ROWEXCESS       : 17 
RECOMMENDATIONS       :The object has chained rows that can be removed 
by re-org. 
C1                    : 
C2                    : 
C3                    : 
TASK_ID               : 261 
MESG_ID               : 0 
  此处您将看到,模式 ARUP 中表 ACCOUNTS 的分区 P7 包含链接行。执行重新组织将帮助加快该分区全表扫描的速度。

  此信息由在预定义的维护时间窗(周末下午 10 点至早上 6 点以及周六中午 12 点至周一中午 12 点)内运行的自动调度作业收集;您可以使用 Oracle Enterprise Manager 更改这些时间窗。在此时间内,该作业将对段进行扫描以获取符合要求的段。如果扫描无法及时完成,该作业将暂停并在第二天的时间窗继续扫描。

  该作业存储有关在名为 wri$_segadv_objlist 的表中检查的段和表空间的信息。可以查看有关在视图 DBA_AUTO_SEGADV_CTL 中检查的段的信息。

  基于事件的调度

  Oracle 数据库 10g 第 1 版中引入的 Oracle Scheduler 是下一代作业调度系统,它取代了 DBMS_JOB 附带的程序包。与该程序包相比,此 Scheduler 工具有一些显著的优点。

  在 Oracle Scheduler 的第一版中,作业基于时间并根据时间触发。但如果要使触发器基于事件该怎么办?例如,当帐户的 Account Manager 更改时,您可能希望一个批处理程序自动执行以重新计算收入并重新发布报表。

  可以在 Oracle 数据库 10g 第 2 版的 Scheduler 工具中实现此类基于事件的触发。事件通过 Advanced Queueing (AQ)(其中有效载荷是一个对象类型)传递给 Scheduler。因此,您首先需要创建一个 AQ(如 proc_queue),在这里将把任意这样的事件排队。然后,您必须基于此事件创建一个调度。
begin 
dbms_scheduler.create_event_schedule ( 
schedule_name   => 'accadmin.acc_mgr_change', 
start_date      => systimestamp, 
event_condition => 'tab.user_data.event_name = ''acc_mgr_change''', 
queue_spec      => 'proc_queue'); 
end; 
  接着,您将创建一个作业以遵循此调度。您也可以直接调度一个作业而不用先创建一个调度。
begin 
dbms_scheduler.create_job ( 
job_name        => acc_mgr_change, 
program_name    => acc_mgr_change_procs, 
start_date      => 'systimestamp, 
event_condition => 'tab.user_data.event_name = ''acc_mgr_change''', 
queue_spec       => 'proc_queue' 
enabled          => true); 
end; 
  默认值是 UNLIMITED。

  如果事件(而不是特定时间)是触发作业的决定因素,则基于事件的调度很有帮助。
阅读(271) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~