2013-05-05 317 views
12

有沒有辦法更新所有表的所有統計信息,無論擁有者是誰?Oracle手動更新所有表上的統計信息

我發現這個sniplet,但我不知道這是否會抓住所有表....

BEGIN 
    FOR A IN (SELECT owner FROM SYS.all_tables) LOOP 
     execute immediate 
     EXEC dbms_stats.gather_schema_stats('A.owner', cascade='TRUE'); 
    END LOOP; 
END; 
+1

SELECT DISTINCT所有者FROM SYS.all_tables – 2013-10-12 10:53:17

回答

7

DBMS_STATS包可以做一次最多一個架構。

您可以使用下面的腳本來收集所有模式中所有對象類型的統計數據。你列出的那個有幾個問題(不必立即執行,`A.owner'是一個字符串,但它應該是一個對象等)。

你可以添加額外的模式來跳過IN列表,因爲你可能不想爲內置模式執行此操作(反正它們大多是靜態的,所以它會浪費)。此外,您需要爲每個正在收集統計數據的模式擁有適當的權限(或以DBA身份登錄)。

收集的所有對象(你真的想大概是什麼)統計:

BEGIN 
    FOR rec IN (SELECT * 
       FROM all_users 
       WHERE username NOT IN ('SYS','SYSDBA')) 
    LOOP 
     dbms_stats.gather_schema_stats(rec.username); 
    END LOOP; 
END; 

收集的只是表統計:

BEGIN 
    FOR rec IN (SELECT * 
       FROM all_tables 
       WHERE owner NOT IN ('SYS','SYSDBA')) 
    LOOP 
     dbms_stats.gather_table_stats(rec.owner, rec.table_name); 
    END LOOP; 
END; 
13
+3

雖然此鏈接可能回答此問題,但最好在此處包含答案的基本部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – SysDragon 2013-05-06 07:19:23

+2

@SysDragon我的答案既是功能又是鏈接。我添加了一個'exec'和';'使其更加清晰。 – 2013-05-06 18:38:21

+0

並且如預測的那樣,鏈接被破壞。 – 2014-12-04 16:17:48