Oracle資料庫重建無效和不可用對象
無效和不可用對象
無效 PL/SQL 對象和不可用索引會對效能產生影響。無效 PL/SQL 對象必須先進行重編譯,然後才能使用。這需要在執行嘗試訪問 PL/SQL 程式包、過程或函數的第一個操作之前花費一段編譯時間。如果 PL/SQL 重編譯未成功,則操作會因發生錯誤而失敗。最佳化程式會忽略不可用索引。如果 SQL 陳述式效能的好壞取決於已標記為停用索引,則只有重建索引才能改善效能。
無效 PL/SQL 對象:可通過查詢資料字典查看 PL/SQL 對象的目前狀態。
可使用以下命令列尋找到無效 PL/SQL 對象:
SELECT object_name, object_type FROM DBA_OBJECTS
WHERE status = 'INVALID';
預設情況下,每 24 小時檢查一次“所有者的無效對象計數”度量。如果一個所有者的對象數超過兩個,就會發出預警。
如果尋找到 INVALID 狀態的 PL/SQL 對象,需要回答的第一個問題是“此對象曾經是 VALID 的嗎?”應用程式開發人員常常會忘記清除不起作用的代碼。如果 PL/SQL 對象因代碼錯誤而無效,則除了糾正該錯誤之外,沒有什麼別的方法。如果該過程在過去曾經有效,最近才變為無效,則可選擇以下兩種方法解決這個問題:
1.不做任何處理。如果需要,大多數 PL/SQL 對象在調用時會自動重新編譯。使用者在對象重新編譯時間會經曆短暫的延遲。(大多數情況下,這種延遲不十分明顯。)
2.手動重新編譯無效對象。
使用 Enterprise Manager 或通過 SQL 命令可手動重新編譯無效的 PL/SQL 對象
ALTER PROCEDURE HR.add_job_history COMPILE;
手動重新編譯 PL/SQL 資料包,需要執行以下兩個步驟:
ALTER PACKAGE HR.maintainemp COMPILE;
ALTER PACKAGE HR.maintainemp COMPILE BODY;
不可用索引:可通過查詢 DBA_INDEXES 資料字典視圖尋找無效索引:
SELECT index_name, table_name FROM DBA_INDEXES
WHERE status ='UNUSABLE';
對於分區索引,狀態儲存在 DBA_IND_PARTITIONS 視圖中。
通過重建不可用索引來重算指標,可使不可用索引變為有效。重建不可用索引會在新位置重新建立索引,然後會刪除不可用索引。
使用 Enterprise Manager 或通過 SQL 命令可完成此操作:
ALTER INDEX HR.emp_empid_pk REBUILD;
ALTER INDEX HR.emp_empid_pk REBUILD ONLINE;
ALTER INDEX HR.email REBUILD TABLESPACE USERS;
如果省略了 TABLESPACE 子句,則在曾經存在的相同資料表空間中重建索引。
使用 REBUILD ONLINE 子句,使用者可以在重建時繼續更新索引表。(如果不使用 ONLINE 關鍵字,使用者必須等待重建完成後才能對受影響的表執行 DML。如果索引不可用,即使使用了 ONLINE 關鍵字,也不會在重建過程中使用該索引。)
Enterprise Manager 使用“Reorganize(重組)”操作修複 UNUSABLE 索引。
註:重建索引時需要有可用於重建的空閑空間。請在嘗試重建前驗證是否有足夠的空間。Enterprise Manager 會自動檢查空間要求。
--------------------------------------分割線 --------------------------------------
rlwrap - 解決Linux下SQLPLUS退格、上翻鍵亂碼問題
SQLPLUS spool 到動態記錄檔名
Oracle SQLPLUS提示符設定
通過設定SQLPLUS ARRAYSIZE(行預取)加快SQL返回速度
--------------------------------------分割線 --------------------------------------