使用job scheduler重建索引

使用job scheduler重建索引

http://www.dbaliu.com/?p=159

在数据库优化中Index 是一个重要因素。在Oracle 10g中,rebuild online是组建索引的一个重要特性。
在以下情况下应该考虑重建索引:
• 删除的行数超过了总数的30%, 就是说 DEL_LF_ROWS / LF_ROWS > 0.3.
• 索引的高度大于4.
• 叶子节点的行数 (‘LF_ROWS’) 明显小于叶子块的数量(‘LF_BLKS’)这表明大量的数据被删除了, 需要重建索引.
• BLOCK_GETS 大于 5

在一个数据库中可能存在成千上万条索引,这样手工的去重建可能不是一件容易的事情,所以可以考虑使用job scheduler 来重建索引。

具体步骤如下:
1.创建一张temp_index_stat表,其结构和index_stats类似;
2.创建一个gen_index_stat存储过程,它用于分析索引同时将数据存放在temp_index_stat表中;
3.为了不对生产库造成影响,创建一个LOW_GROUP级别的资源用户组的job class — low_priority_class;
4.创建一个job — get_index_stat_job;
5.创建另外一张表running_cmds;
6.创建另外一个procedure — rebuild_index,用于重建索引;
7.创建另外一个job rebuild_index_job 来调用上述的程序来重建索引。

请确保不是在业务高峰期,如果这样可能会出现resource timeout的错误,而导致job运行失败。

脚本如下:

CREATE TABLE TEMP_INDEX_STAT
AS
SELECT *
FRO INDEX_STATS
WHERE 1=2;

CREATE OR REPLACE PROCEDURE GEN_INDEX_STAT
(HONCHO_SCHEMA VARCHAR2)
IS
CURSOR INDEX_CUR IS
SELECT INDEX_NAME
FROM DBA_INDEXES d
WHERE WNER = ‘HONCHO_SCHEMA’
AND NOT EXISTS
(
SELECT 1
FROM temp_index_stat b
WHERE d.index_Name = b.NAME
)
AND INDEX_TYPE = ‘NORMAL’;
v_str VARCHAR2(500);
BEGIN
FOR INDEX_REC IN INDEX_CUR LOOP
v_str := ‘ANALYZE INDEX
‘||HONCHO_SCHEMA||’.'||INDEX_REC.INDEX_NAME||’
VALIDATE STRUCTURE ‘;
EXECUTE IMMEDIATE v_str;
v_str := ‘insert into TEMP_INDEX_STAT select * from index_stats’;
EXECUTE IMMEDIATE v_str;
COMMIT;
END LOOP; –
END GEN_INDEX_STAT;
/

begin
dbms_scheduler.create_job_class(
job_class_name => ‘LOW_PRIORITY_CLASS’,
resource_consumer_group => ‘LOW_GROUP’,
logging_level => DBMS_SCHEDULER.LOGGING_FULL,
log_history => 60,
comments => ‘LOW PRIORITY JOB CLASS’);
end;
/

如果你想按照预定的时间安排job,可以设置start_time

BEGIN
dbms_scheduler.create_job
(
job_name=> ‘GEN_INDEX_STAT_JOB’,
job_type=> ‘PLSQL_BLOCK’,
job_action=>’begin GEN_INDEX_STAT(”T24”); end;’,
START_DATE=>NULL,
REPEAT_INTERVAL=>NULL,
ENABLED=>TRUE,
AUTO_DROP=>FALSE,
COMMENTS=>’Generate Index Stat’,
job_class=>’LOW_PRIORITY_CLASS’
);
END;
/

到这时我们可以收集schema中所有index,现在可以按照我们所说的条件rebulid index。

CREATE TABLE RUNNING_CMDS
(
CMD VARCHAR2(200)
);

这张表用于存放操作命令,这样当job运行之后,可以很容易识别哪些索引重建了。

CREATE OR REPLACE PROCEDURE REBUILD_INDEX(HONCHO_SCHEMA VARCHAR2)
IS
CURSOR CUR IS
SELECT NAME
FROM TEMP_INDEX_STAT a
WHERE (HEIGHT >= 4
OR
(del_lf_rows/lf_rows > 0.3 AND lf_rows > 0)
or (blks_gets_per_access > 4)
)
AND EXISTS
(
SELECT 1
FROM dba_indexes d
WHERE a.NAME = D.index_name
AND d.index_type <> ‘LOB’
);
v_str varchar2(200);
BEGIN
execute immediate ‘truncate table RUNNING_CMDS’;
FOR REC IN CUR LOOP
v_str := ‘ALTER INDEX ‘||HONCHO_SCHEMA||’.'||REC.NAME||’ REBUILD ONLINE’;
INSERT INTO RUNNING_CMDS
VALUES(V_STR);
COMMIT;
EXECUTE IMMEDIATE v_str;
END LOOP;
END REBUILD_INDEX;
/

BEGIN
dbms_scheduler.create_job
(
job_name=> ‘REBUILD_INDEX_JOB’,
job_type=> ‘PLSQL_BLOCK’,
job_action=>’begin REBUILD_INDEX(”T24”); end;’,
START_DATE=>NULL,
REPEAT_INTERVAL=>NULL,
ENABLED=>TRUE,
AUTO_DROP=>FALSE,
COMMENTS=>’Rebuild Index’,
job_class=>’LOW_PRIORITY_CLASS’
);
END;
/

可以根据自己的需求设置start_date。

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

转载于:http://blog.itpub.net/17252115/viewspace-747933/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JobScheduler是Android中的一个调度框架,它可以用来在特定的时间间隔或特定的条件下执行任务,同时也可以用来保持应用的活跃状态。 在Android系统中,应用程序在后台运行时有一定概率被系统回收释放内存,为了提高应用的用户体验和功能完整性,我们可以使用JobScheduler来保活应用。 具体实现方法如下: 1. 在AndroidManifest.xml文件中注册JobService,用于执行任务和保活应用。设置jobService的权限,以及设置该service的处理逻辑。 2. 在需要保活的地方调用JobScheduler的schedule()方法,创建一个JobInfo对象,并设置好相关参数。其中包括指定要执行的JobService、执行的触发条件(如设备空闲时、特定时间间隔、特定网络状态等)、设置重试或重复执行等。 3. 通过JobScheduler.schedule()方法将JobInfo对象提交给系统进行调度。系统会根据设置的条件和触发机制来执行任务。 需要注意的是,JobScheduler的保活机制是通过系统的调度来实现的,并不能保证100%的成功保活。因为在一些特殊的情况下,如低内存、电池低、系统启动等情况下,系统可能会暂停或取消JobScheduler的任务。所以我们还需要配合其他的保活机制来提高保活的成功率,如使用前台服务、双进程守护、自启动、推送等。 总结起来,JobScheduler是Android系统提供的一种调度框架,可以在一定程度上保活应用。通过设置JobInfo的相关参数,然后由系统进行调度执行,以确保应用的持续运行和活跃状态。同时,为了提高保活的成功率,我们还需要结合其他的保活机制来综合应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值