最近公司客户反映有些页面运行速度太慢,通过对系统代码的分析,发现排行榜功能是罪魁祸首,因为数据量太大,每次刷新页面都计算一次排行榜,的确耗时费力。
其实可以让数据库自己计算排行榜,并把计算结果保存到一个单独的表里去,这个表只用来保存排行榜的数据,数据量很小,然后所有的排行榜查询都去select这个表。
计算排行榜的功能我们可以写成一个存储过程,但是排行榜的数据不是一成不变的,还需要不时的调用这个存储过程才行,oracle为我们提供了dbms_jobs。
oracel dbms_jobs包可以提交作业到作业队列中,这个包中还提供其它一些函数管理以前提交的作业,如对作业进行修改、禁止或删除等操作。
常用函数:
submit(),提交作业到作业队列。
isumbit(),
remove(),从作业队列中删除作业。
change(),改变已有作业的参数。
what(),改变作业要执行的代码。
next_date(),改变作业下一次执行时间。
interval(),改变作业执行的时间间隔。
broken(),暂停执行作业。
run(),强制执行作业。
最常用的submit()函数:
dbms_jobs.submit(
job out binary_integer,
what in varchar2,
next_date in date default sysdate,
interval in varchar default null,
no_parse in boolean default false,
instance in binary_integer default any_instance,
force in boolean default false
);
submit函数参数:
job,作业的作业号,是个输出参数,所以调用submit函数时,这个参数要指定一个已存在的变量。
what,作业要执行的代码,一般是存储过程。
next_date,下一次作业运行的日期。
interval,作业执行的间隔时间,这个参数默认值是null,也就是what指定的代码只在next_date这一时间执行一次。
no_parse,默认值是false,当参数值是false,提交作业时就对what指定的代码进行语法分析;当参数值是true,第一次运行what指定代码时才进行语法分析。
instance,指明运行作业的数据库实例。
force,如果是true,instance可以是任何正数;如果是false,instance指定的实例必须正在运行。
示例:
var jobno number;
begin
dbms_job.submit(:jobno,'p_xxx_taxis;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');--每天18点执行
commit;
end;
上面这段话要在 命令窗口 下运行,如在pl/sql developer里面的-->新键-->命令窗口
这样就会在每天的18点执行存储过程p_xxx_taxis。在我这里p_xxx_taxis执行的是计算排行榜的任务。