記一次SQL優化的經歷(數據庫定時任務)


問題描述:工作中遇到的一次問題,我們在一個展示頁面數據加載太慢,原因是展示的數據是從視圖中獲取的,但是視圖的結構比較復雜,使用了多表關聯,數據是從多個表中獲取的。最開始是去想辦法優化視圖以及視圖中用到的表。但是由於結構復雜,優化過后還是慢,比如用一個order by查詢時間上會超過上百秒,這樣肯定是不行的。只能換種方法,於是決定用數據庫的定時任務去定時的刪除表數據,新增表數據,簡單說就是更新數據。但是第一次接觸,還是花費了些時間。

代碼如下:

--創建表V_TEST,數據與結構和視圖要一樣

CREATE TABLE V_TEST AS SELECT * FROM TEST; 

--定義定時任務SCIENTIFIC_JOB,用於刷新數據

declare TEST_JOB number;

BEGIN   

  DBMS_JOB.SUBMIT(         

     JOB => TEST_JOB,  --任務名字       

     WHAT =>'DELETE FROM V_TEST;INSERT INTO V_TEST SELECT * FROM TEST;COMMIT;',  --需要執行的存儲過程名稱或SQL語句           

     NEXT_DATE => SYSDATE,  --初次執行時間-立即執行         

     INTERVAL => 'TRUNC(SYSDATE+1)+9/24'  --每天早上九點     

   );

  COMMIT;     

end; 



--注意!!! 這里要查出TEST_JOB的ID,會在下面用到。 查出LOG_USER為當前數據庫用戶的ID即為任務ID 

select * from dba_jobs;



--執行任務 1183是上面查出來的ID  需要自己替換

begin       

  dbms_job.run(1183);

end;  



定時任務相關查詢語句:

--查看系統當前時間        因為是遠程服務器,所以時間和本地會不一樣

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;



--查看所有的定時任務

select * from dba_jobs; 



-- 查看正在執行的調度任務

select * from dba_jobs_running;



 --刪除任務 1183是查詢任務的ID

begin   

  dbms_job.remove(1183); 

 end;   

 

好久沒有發博客了,最近有點忙。加油0.0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM