Coleta de Estatísticas em ambiente Multitenant / Singletenant

Em ambiente Multitenant as estatísticas devem ser coletadas no CDB e em todos os PDBs. Estas coletas são comandos separados. o GATHER_DATABASE_STATS não coleta tudo.

Aliás, mesmo em ambientes Singletenant, como há o CDB e o PDB, devem ser implementadas duas rotinas de coletas.

Veja abaixo que de acordo com a DBA_TAB_STATISTICS, esse banco tem 158 objetos com estatísticas desatualizadas (STALE_STATS = YES).

C:\Users\ricar>sqlplus / AS SYSDBA

SQL*Plus: Release 12.1.0.2.0 Production on Ter Dez 27 18:48:41 2016

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM DBA_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
                 0
              2264 NO
               158 YES

SQL>

Mas olhando na CDB_TAB_STATISTICS (que agrega todas as Views DBA_TAB_STATISTICS, assim como as DBA_* agregam todas as USER_*), há 170 objetos com estatísticas desatualizadas no total. No SELECT anterior, eu estava conectado no CDB (sqlplus / AS SYSDBA), e as Views DBA_* são referentes aonde estou conectado, então aqueles 158 objetos são do CDB.

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM CDB_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
              4798 NO
                 0
               170 YES

SQL>

Faço uma coleta dos objetos STALE, ainda conectado no CDB, e verifico os objetos novamente. Veja que ainda temos 12 objetos STALE, que devem ser do PDB.

SQL> EXEC DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER STALE');

Procedimento PL/SQL concluÝdo com sucesso.

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM DBA_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
                 0
              2422 NO

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM CDB_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
              4956 NO
                 0
                12 YES

SQL>

Agora me conecto no PDB, faço uma nova coleta de objetos STALE, e refaço os SELECTs. Veja que tanto os dois trazem o mesmo resultado, pois a CDB_TAB_STATISTICS só vê o PDB quando estou conectado no PDB.

SQL> ALTER SESSION SET CONTAINER = TESTE;

SessÒo alterada.

SQL> EXEC DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER STALE');

Procedimento PL/SQL concluÝdo com sucesso.

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM DBA_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
                 0
              2546 NO

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM CDB_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
                 0
              2546 NO

SQL>

Agora volto para o CDB, e refaço os dois SELECTs. Agora a CDB_TAB_STATISTICS vê tudo (4968 objetos).

SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;

SessÒo alterada.

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM DBA_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
                 0
              2422 NO

SQL> SELECT COUNT(STALE_STATS), STALE_STATS FROM CDB_TAB_STATISTICS GROUP BY STALE_STATS;

COUNT(STALE_STATS) STA
------------------ ---
              4968 NO
                 0

SQL>

3 comments

    1. Oi Zaballa.
      Interessante, eu descobri isso também em um cliente, pois a documentação não era clara a respeito e eu não coletava no CDB e PDB. Aí descobri (através de um Plano errado) que além da FIXED, também é necessária a coleta de System Statistics.

      Muito obrigado pelo comentário!

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.