シャード表のオプティマイザ統計の収集

コーディネータ・データベースからシャード表の統計を収集できます。

統計プリファレンス・パラメータCOORDINATOR_TRIGGER_SHARDがすべてのシャードでTRUEに設定されている場合、コーディネータ・データベースはシャードで収集された統計をインポートできます。

PL/SQLプロシージャDBMS_STATS.GATHER_SCHEMA_STATS()およびDBMS_STATS.GATHER_TABLE_STATS()は、シャードおよびコーディネータ・データベース内のシャード表および重複表に関する統計を収集します。REPORT_GATHER_TABLE_STATS関数も参照してください。

手動統計収集

  1. すべてのシャードでCOORDINATOR_TRIGGER_SHARDTRUEに設定します。

    このステップは、1回のみシャードで実行されます。たとえば、sharduserという名前のスキーマがあるとします。

    connect / as sysdba
    EXECUTE DBMS_STATS.SET_SCHEMA_PREFS('SHARDUSER','COORDINATOR_TRIGGER_SHARD','TRUE');
  2. シャード全体の統計を収集します。

    ユーザーは全シャード・ユーザーであり、ディクショナリ表にアクセスする権限を持っている必要があります。

    1. シャードで、次を実行します。
      connect sharduser/password
      EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'SHARDUSER', options => 'GATHER');
    2. すべてのシャードが完了したら、集計統計をプルするためにコーディネータで次を実行します。
      connect sharduser/password
      EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'SHARDUSER', options => 'GATHER');
    3. すべてのシャードの統計を確認します。
      connect sharduser/password
      
      ALTER SESSION SET nls_date_format='DD-MON-YYYY HH24:MI:SS';
        col TABLE_NAME form a40
        set pagesize 200 linesize 200
      
      SELECT TABLE_NAME, NUM_ROWS, sharded, duplicated, last_analyzed
        FROM user_tables
        WHERE table_name not like 'MLOG%' and table_name not like 'RUPD%'
        and table_name not like 'USLOG%';

自動統計収集

  1. すべてのシャードでCOORDINATOR_TRIGGER_SHARDTRUEに設定します。

    このステップは、1回のみシャードで実行されます。たとえば、sharduserという名前のスキーマがあるとします。

    connect / as sysdba
    EXECUTE DBMS_STATS.SET_SCHEMA_PREFS('SHARDUSER','COORDINATOR_TRIGGER_SHARD','TRUE');
  2. シャードおよびコーディネータ・データベースで集計された統計をプルするジョブをスケジュールします。

    ユーザーは全シャード・ユーザーであり、ディクショナリ表にアクセスする権限を持っている必要があります。

    シャードで次のジョブを開始します。

    connect sharduser/password
    BEGIN 
    DBMS_SCHEDULER.CREATE_JOB ( 
       job_name => 'Gather_Stats_2', 
       job_type => 'PLSQL_BLOCK',
       job_action => 'BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => ''DEMO'', options => ''GATHER''); END;',
       start_date => SYSDATE,
       repeat_interval => 'freq=daily;byday=MON,TUE,WED,THU,FRI,SAT,SUN;byhour=14;byminute=10;bysecond=00',
       end_date => NULL,
       enabled => TRUE,
       comments => 'Gather table statistics');
    END; 
    /

    すべてのシャードのジョブが終了したら、コーディネータで次のジョブを開始します。

    connect sharduser/password
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
       job_name             => 'Gather_Stats_2',
       job_type             => 'PLSQL_BLOCK',
       job_action           => 'BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => ''DEMO'', options => ''GATHER''); END;',
       start_date           =>  SYSDATE,
       repeat_interval      => 'freq=daily;byday=MON,TUE,WED,THU,FRI,SAT,SUN;byhour=15;byminute=10;bysecond=00', 
       end_date             =>  NULL,
       enabled              =>  TRUE,
       comments             => 'Gather table statistics');
    END;
    /