最近公司客戶反映有些頁面運行速度太慢,通過對系統代碼的分析,發現排行榜功能是罪魁禍首,因為數據量太大,每次刷新頁面都計算一次排行榜,的確耗時費力。
其實可以讓數據庫自己計算排行榜,并把計算結果保存到一個單獨的表里去,這個表只用來保存排行榜的數據,數據量很小,然后所有的排行榜查詢都去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執行的是計算排行榜的任務。