最近公司客戶反映有些頁(yè)面運(yùn)行速度太慢,通過(guò)對(duì)系統(tǒng)代碼的分析,發(fā)現(xiàn)排行榜功能是罪魁禍?zhǔn)祝驗(yàn)閿?shù)據(jù)量太大,每次刷新頁(yè)面都計(jì)算一次排行榜,的確耗時(shí)費(fèi)力。
其實(shí)可以讓數(shù)據(jù)庫(kù)自己計(jì)算排行榜,并把計(jì)算結(jié)果保存到一個(gè)單獨(dú)的表里去,這個(gè)表只用來(lái)保存排行榜的數(shù)據(jù),數(shù)據(jù)量很小,然后所有的排行榜查詢都去select這個(gè)表。
計(jì)算排行榜的功能我們可以寫成一個(gè)存儲(chǔ)過(guò)程,但是排行榜的數(shù)據(jù)不是一成不變的,還需要不時(shí)的調(diào)用這個(gè)存儲(chǔ)過(guò)程才行,oracle為我們提供了dbms_jobs。
oracel dbms_jobs包可以提交作業(yè)到作業(yè)隊(duì)列中,這個(gè)包中還提供其它一些函數(shù)管理以前提交的作業(yè),如對(duì)作業(yè)進(jìn)行修改、禁止或刪除等操作。
常用函數(shù):
submit(),提交作業(yè)到作業(yè)隊(duì)列。
isumbit(),
remove(),從作業(yè)隊(duì)列中刪除作業(yè)。
change(),改變已有作業(yè)的參數(shù)。
what(),改變作業(yè)要執(zhí)行的代碼。
next_date(),改變作業(yè)下一次執(zhí)行時(shí)間。
interval(),改變作業(yè)執(zhí)行的時(shí)間間隔。
broken(),暫停執(zhí)行作業(yè)。
run(),強(qiáng)制執(zhí)行作業(yè)。
最常用的submit()函數(shù):
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函數(shù)參數(shù):
job,作業(yè)的作業(yè)號(hào),是個(gè)輸出參數(shù),所以調(diào)用submit函數(shù)時(shí),這個(gè)參數(shù)要指定一個(gè)已存在的變量。
what,作業(yè)要執(zhí)行的代碼,一般是存儲(chǔ)過(guò)程。
next_date,下一次作業(yè)運(yùn)行的日期。
interval,作業(yè)執(zhí)行的間隔時(shí)間,這個(gè)參數(shù)默認(rèn)值是null,也就是what指定的代碼只在next_date這一時(shí)間執(zhí)行一次。
no_parse,默認(rèn)值是false,當(dāng)參數(shù)值是false,提交作業(yè)時(shí)就對(duì)what指定的代碼進(jìn)行語(yǔ)法分析;當(dāng)參數(shù)值是true,第一次運(yùn)行what指定代碼時(shí)才進(jìn)行語(yǔ)法分析。
instance,指明運(yùn)行作業(yè)的數(shù)據(jù)庫(kù)實(shí)例。
force,如果是true,instance可以是任何正數(shù);如果是false,instance指定的實(shí)例必須正在運(yùn)行。
示例:
var jobno number;
begin
dbms_job.submit(:jobno,'p_xxx_taxis;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');--每天18點(diǎn)執(zhí)行
commit;
end;
上面這段話要在 命令窗口 下運(yùn)行,如在pl/sql developer里面的-->新鍵-->命令窗口
這樣就會(huì)在每天的18點(diǎn)執(zhí)行存儲(chǔ)過(guò)程p_xxx_taxis。在我這里p_xxx_taxis執(zhí)行的是計(jì)算排行榜的任務(wù)。