1.找出無用索引:
DML 性能低下,其中最嚴重的原因之一是無用索引的存在。所有SQL的插入,更新和刪除操作在它們需要在每一行數據被改變時修改大量索引的時候會變得更慢。許多Oracle 管理人員只要看見在一個SQL 查詢的WHERE語句出現了一列的話就會為它分配索引。雖然這個方法能夠讓SQL運行得更快速,但是基於功能的Oracle 索引使得數據庫管理人員有可能在數據表的行上過度分配索引。過度分配索引會嚴重影響關鍵Oracle 數據表的性能。
在Oracle9i出現以前,沒有辦法確定SQL查詢沒有使用的索引。Oracle9i有一個工具能夠讓你使用ALTER INDEX命令監視索引的使用。然後你可以查找這些沒有使用的索引並從數據庫裡刪除它們。
下面是一段腳本,它能夠打開一個系統中所有索引的監視功能:
spool run_monitor.sql
select 'alter index '||owner||'.'||index_name||' monitoring usage;'
from dba_indexes
where owner not in ('SYS','SYSTEM');
spool off;
@run_monitor
你需要等待一段時間直到在數據庫上運行了足夠多的SQL語句以後,然後你就可以查詢新的V$OBJECT_USAGE視圖。
select index_name,table_name,mon,used
from v$object_usage;
在下面,我們可以看見V$OBJECT_USAGE有一列被稱作USED,它的值是YES或者NO。它不會告訴你Oracle使用了這個索引多少次,但是這個工具對於找出沒有使用的索引還是很有用的。
SQL> select * from v$object_usage where rownum < 10;
INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING
------------------------------ ------------------------------ ---------- ---- ------------------- -------------------
ASD DIM_ACCT_ITEM_TYPE_TEMP YES NO 01/15/2004 13:50:59
IDX_ACCOUNT_ACCESSORY_TARIFF1 ACCOUNT_ACCESSORY_TARIFF YES NO 01/15/2004 13:50:59
IDX_ACCOUNT_QUOTA_LOG1 ACCOUNT_QUOTA_LOG YES NO 01/15/2004 13:50:59
IDX_ACCOUNT_SYSTEM_PARAMETERS1 ACCOUNT_SYSTEM_PARAMETERS YES NO 01/15/2004 13:50:59
IDX_ACCT2 ACCT YES NO 01/15/2004 13:50:59
IDX_ACCT3 ACCT YES NO 01/15/2004 13:51:00
IDX_ACCT4 ACCT YES NO 01/15/2004 13:51:00
IDX_ACCT_BIND_DISCT1 ACCT_BIND_DISCT YES NO 01/15/2004 13:51:00
IDX_ACCT_BIND_DISCT2 ACCT_BIND_DISCT YES NO 01/15/2004 13:51:00
2.查看一個很長的操作已經做了多少:
v$session_longops視圖可以使Oracle專家減少運行時間很長的DDL和DML語句的運行時間。例如在數據倉庫環境中,即使使用並行索引創建技術,構建一個很多G字節大的索引需要耗費很多個小時。這裡你就可以查詢v$session_longops視圖快速找出一個特定的DDL語句已經完成了多少。其實v$session_longops視圖也可以用於任何運行時間很長的操作,包括運行時間很長的更新操作。
下面的腳本將顯示一個狀態信息,說明了運行時間很長的DDL操作已經使用的時間。注意你必須從v$session中取得SID並將其插入到下面的SQL語句中:
select sid,start_time,elapsed_seconds,message
from v$session_longops
where sid = 13
order by start_time;
這裡是一個輸出的例子,顯示了運行時間很長的CREATE INDEX語句的運行過程。
SID MESSAGE
--- ---------------------------------------------------------------
11 Table Scan: CUST.PK_IDX: 732 out of 243260 Blocks done
3.用set transaction 命令解決ORA-01555錯誤
在執行大事務時,有時oracle會報出如下的錯誤:
ORA-01555:snapshot too old (rollback segment too small)
這說明oracle給此事務隨機分配的回滾段太小了,這時可以為它指定一個足夠大的回滾段,以確保這個事務的成功執行.例如
set transaction use rollback segment roll_abc;
delete from table_name where ... ;
commit;
提交結束後ORACLE會自動釋放對 roll_abc 的指定。