Oracle數據庫是凌晨一個(gè)復雜的系統,需要(′?_?`)定期進(jìn)行優(yōu)化以保持其最佳性能(╬?益?),定時(shí)e定動(dòng)優(yōu)手動(dòng)優(yōu)化可能是器幫一項耗時(shí)且容易出錯的??任務(wù),因此使用凌晨定時(shí)器自動(dòng)執行優(yōu)化任務(wù)是時(shí)進(jìn)一個(gè)很好的解決方案,??在本教程中,??行自(zi)我們??將介紹如何使用凌晨定時(shí)器幫助Oracle定時(shí)進(jìn)行自動(dòng)優(yōu)化。凌晨
(圖片來(lái)源網(wǎng)絡(luò ),定時(shí)e定動(dòng)優(yōu)侵刪)1、器幫創(chuàng )建優(yōu)化腳本
我們需要創(chuàng )建一個(gè)Oracle優(yōu)化腳本,時(shí)進(jìn)這個(gè)腳本將包含一系列的行自SQL命令,用于分析表??、凌晨索引和統計信息,定時(shí)e定動(dòng)優(yōu)以及執行相應的器幫優(yōu)化操作,以下是時(shí)進(jìn)一個(gè)簡(jiǎn)單的優(yōu)化(hua)腳本示例:
分析表空間ANALYZE TABLE SYS.USERS COMPUTE STATISTICS;ANALY??ZE TABLE SYS.ORDERS COMPUTE STATISTICS;ANALYZE TABLE SYS.DEPT COMPUTE STATISTICヾ(′▽?zhuān)??S;分析索引ANALYZE INDEX SYS.USERS_PK;ANALYZE INDEX SYS.ORDERS_(◎_◎;)PK;ANALYZE INDEX SYS.DEPT_PK;更新統計信息DBMS_STATS.GATHER_DAT( ?ヮ?)ABASE_STATS(???estim┐(′д`)┌ate??_percent=>DBMS?_STATS.AUTO_SAMPLE_S??IZE,cascade=>??;TRUE);
2、創(chuàng )建PL/SQL程序包
接下來(lái),行自我們需要創(chuàng )建一個(gè)PL/┐(′?`)┌SQL程序包,用于存儲我們的優(yōu)化腳本,在這個(gè)程序包(°□°)中,我們將定義一個(gè)存??儲過(guò)程,該過(guò)程將在運行時(shí)執行??我(wo)們的優(yōu)化腳本,以下是一個(gè)簡(jiǎn)單的PL/SQL程序包示例:
CREATE OR REPLACE PACKAGE OPTIM_PACKAGE AS PROCEDURE RUN_OPTIMIZATION;END OPTIM_PACKAGE;/
在程序包定義中添加我們的優(yōu)化腳本:
CREATE OR REPLACE PACKAGE BODY OP??TIM_PACKAGE AS PROCEDURE RUN_OPTIMIZATION IS CURSOR c_tables IS SELECT ta??ble_name FROM user_tables; CURSOR c_indexes IS SELECT index_name FROM user_indexes; v_sql CLOB; BE???GIN FOR r_table IN c_tables loop v_sql := v_sql || 'ANALYZE TA(′_ゝ`)BLE ' || r_table.table_name || ' COMPUTE STATISTICS;'; END loop; FOR r_index IN c_indexes loop="" v_sql := v_sql || 'ANALYZE INDEX ' || r_index.index_name || ';'; END loop; EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=LINGUISTIC'; EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=BINARY_CI'; EXECUTE IMMEDI┐(′д`)┌ATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYYM??MDD''' ||(??-)? 'HH24:MI:SS''' || '''' || 'NLS_NUMERIC_CHARACTERS=''.,''' || '''' || 'NLS(╥_╥)_CURRENCY=''$''' || '''' || 'NLS_??ISO_CURRENCY='??'$''' || '''' || 'NLS_LANGUAGE=''AMERICAN''' || '''' || 'NLS_TERRITORY=''US''' || '''' || 'NLS_CHARAC??TERSET=''AL32UTF8'''; EXECUTE IMMEDIATE 'DBMS_STATS.GATHER_DATABASE_STATS(estimate_percent=>DBMS_STATS.AUTO_SAMPL(′?`*)E_SIZE,cascade=>TRUE)'; COMMIT; END RUN_OPTIMIZATION;END OPTIM_PACKAGE;/3、創(chuàng )建凌晨定時(shí)器任務(wù)
現在??,我們需要創(chuàng )建一個(gè)凌晨定時(shí)器任務(wù),用于在指定的時(shí)間運行我們的優(yōu)化程序包,以下是一個(gè)簡(jiǎn)單的凌晨定時(shí)器任務(wù)示例:
BEGIN DBMS_SCHED??ULER.CREATE_JOB (job_name => 'OPTIM(′?_?`)_JOB', 任務(wù)名稱(chēng) job_type =>??; 'PLSQL??_BLOCK', 任務(wù)類(lèi)??型 job_ac(╯‵□′)╯tion => 'BEGIN OPTIM_PACKA??GE.R??UN_OPTIMIZATION; END;', 任務(wù)動(dòng)作 start_date =>??? TRUNC(SYSDATE) + INTERVAL '7' HOUR, 開(kāi)始時(shí)間(凌晨7點(diǎn)) repeat_interval => 'FREQ=DAILY', 重復間隔(每天))??; 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(??無(wú)限(xian)期)); 結束時(shí)間(無(wú)限期)); 結(jie)束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結(jie)束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期))(╯°□°)╯︵ ┻━┻; 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期??)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)??); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期))(′ω`); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)(′?_?`)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期)); 結束時(shí)間(無(wú)限期(qi))));END;/
4、確保定時(shí)器任務(wù)已啟用并運行
我們需要確保我們的凌晨定時(shí)器任務(wù)已啟用并運行,可以使用以下查詢(xún)來(lái)檢查任務(wù)狀態(tài):
SELECT job_name, status, next_run_date FROM dba_scheduler_jobs;
如果一切正常,您應該看到名為“OPTIM_JOB”的任務(wù)已啟用并計劃在每ヾ(^-^)ノ天凌晨7點(diǎn)運行,現在,您的Oracle數據庫將自動(dòng)進(jìn)行優(yōu)化,無(wú)需手動(dòng)干預。