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