簡體   English   中英

如何編寫查詢,為特定用戶擁有的每個索引生成一組ANALYZE INDEX命令?

[英]How can I write a query that generates a set of ANALYZE INDEX commands for every index owned by a certain user?

如標題所述,在Oracle 10g數據庫中,我想創建一個查詢,該查詢將為特定用戶擁有的每個索引生成一組ANALYZE INDEX命令。 關於數據庫主題,我是一個完全的外行,所以請盡可能保留答案以防偽,謝謝!

在使用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;

還有其他參數:請查閱文檔

如果要為其他用戶的索引生成統計信息,請改用ALL_INDEXES,並限制OWNER。


如果您對ANALYZE感興趣,那么

spool anl_idx.sql

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

spool off

您可以。 但是,如果您是數據庫主題方面的外行,我會非常擔心您正在做的事情會為您自己造成各種問題。 因此,我想問一下您要解決的問題。

  • 通常不推薦使用ANALYZE的許多版本,而推薦使用DBMS_STATS軟件包。
  • 默認情況下,Oracle 10g已經具有一個后台作業,該作業會定期收集有關對象(包括索引)的統計信息。 如果禁用了該功能,則您的DBA幾乎可以肯定有自己的工作來收集您幾乎肯定不想干涉的統計信息。
  • 收集統計信息可能會更改查詢計划,這可能會導致各種性能問題,尤其是在索引統計信息與表統計信息不一致的情況下。

你可以做類似的事情

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;

但我真的想了解您的來歷,然后才建議您實際運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM