2011-04-25 43 views

回答

3

因爲您使用的是Oracle 10g,所以您應該使用DBMS_STATS。這可能是實現簡單,如...

begin 
    for r in (select index_name from user_indexes) 
    loop 
     dbms_stats.gather_index_stats(user, r.index_name); 
    end loop; 
end; 

還有其他參數:C heck out the documentation

如果您想要爲某些其他用戶的索引生成統計信息,請改用ALL_INDEXES,然後限制OWNER。


如果你的心臟上設置ANALYZE然後

spool anl_idx.sql 

select 'analyze index '||&&owner||'.'||index_name||' compute statistics;' 
from all_indexes 
where owner = '&&owner'; 

spool off 
+1

請忘記統計生成的分析命令。分析已棄用,不應再次使用,因爲它與應使用的dbms_stats.gather_ *命令發生衝突。 – 2011-04-25 21:47:25

+1

而且您可能甚至不需要手動收集索引的統計信息。默認情況下收集表統計信息也會收集索引統計信息。如果您重建或重新創建索引,則會自動生成統計信息。 – 2011-04-26 05:43:55

1

可以。然而,如果你是數據庫主題的外行,我會非常擔心你正在做的事情會爲你自己造成各種各樣的問題。所以我會問你想要解決什麼問題。

  • ANALYZE通常不贊成使用DBMS_STATS包的許多版本。
  • 默認情況下,Oracle 10g已經擁有一個定期收集包括索引在內的對象統計信息的後臺作業。如果這被禁用,你的數據庫管理員幾乎肯定會有自己的工作來收集你幾乎肯定不想幹涉的統計數據。
  • 收集統計信息有可能會改變查詢計劃,這可能會導致各種性能問題,特別是在索引統計信息與表統計信息不協調的情況下。

你可以做這樣的事情

DECLARE 
    p_owner VARCHAR2(30) := 'BOB'; -- Replace BOB with the user name you are interested in 
BEGIN 
    FOR idx IN (SELECT * FROM dba_indexes WHERE owner = p_owner) 
    LOOP 
    EXECUTE IMMEDIATE 'ANALYZE INDEX ' || p_owner || '.' || idx.index_name || 
         ' COMPUTE STATISTICS'; 
    END LOOP; 
END; 

但我真的想了解你的出發之前,我建議你實際運行這個未來。

相關問題