• Nenhum resultado encontrado

Estatísticas. Quando coletar? Quanto coletar? Como coletar? Ricardo Portilho Proni Nerv Informática

N/A
N/A
Protected

Academic year: 2021

Share "Estatísticas. Quando coletar? Quanto coletar? Como coletar? Ricardo Portilho Proni Nerv Informática"

Copied!
44
0
0

Texto

(1)

Estatísticas

Quando coletar? Quanto coletar? Como coletar?

Ricardo Portilho Proni

ricardo@informatica.com.br

Nerv Informática

(2)

Isenção de responsabilidade

Não acredite em tudo o que lê.

Por algo estar escrito, não significa que é verdade.

O que é verdade aqui, pode não ser verdade lá.

O que era verdade ontem, pode não ser verdade hoje.

O que é verdade hoje, pode não ser verdade amanhã.

Se os fatos não se adequam à teoria, modifique a teoria.

Questione, e só acredite em fatos: teste.

Quando você mudar algo, podem acontecer três coisas.

(3)

CBO - Cost Based Optimizer: trace 10053

(4)

CBO - Cost Based Optimizer – O que é o custo?

Cost = (

#SRds * sreadtim +

#MRds * mreadtim +

#CPUCycles / cpuspeed ) / sreadtim

OU

Custo = (

Quantidade de leituras de um único bloco * Tempo de leitura de um único bloco + Quantidade de leituras de múltiplos blocos * Tempo de leitura de múltiplos blocos +

Ciclos de CPU / Velocidade da CPU

) / Tempo de leitura de um único bloco

O CBO foi lançado no Oracle 7.

O RBO foi considerado legado no 10g, mas existe até no 12.1.0.2.

(5)

Oracle Optimizer Blog

(6)

Não acredite em tudo o que lê – Planos de execução

(7)

Não acredite em tudo o que lê – Planos de execução

(8)

Não acredite em tudo o que lê - Coleta automática

(9)

Não acredite em tudo o que lê - Coleta automática

(10)

Quando coletar? Coleta automática

(11)

Quando coletar? Coleta automática

(12)

Quando coletar? Coleta automática

(13)

Quando coletar? STALE

(14)

Quando coletar? STALE

(15)

Quando coletar?

(16)

Quando coletar? Coleta manual

Coleta completa

SQL> EXEC DBMS_STATS.GATHER_DATABASE_STATS;

SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SOE');

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SOE','CUSTOMERS');

SQL> EXEC DBMS_STATS.GATHER_INDEX_STATS('SOE','CUSTOMERS_PK');

Coleta de objetos EMPTY e STALE

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

SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SOE',OPTIONS=>'GATHER EMPTY');

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

SQL> EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SOE',OPTIONS=>'GATHER STALE');

(17)

Quando coletar? Coleta manual

(18)

Quando coletar? OPTIMIZER_DYNAMIC_SAMPLING

Nível 0 = Não há coleta.

Nível 1 = Coleta 32 blocos.

Se há pelo menos 1 tabela particionada no SQL sem estatísticas.

Se esta tabela não tem índices.

Se esta tabela tem mais que 64 blocos.

Nível 2 = Coleta 64 blocos.

Coleta se há pelo menos uma tabela do SQL sem estatísticas.

Nível 3 = Coleta 64 blocos.

Coleta se o Nível 2 é atendido OU se é utilizada expressão no WHERE.

Nível 4 = Coleta 64 blocos.

Coleta se o nível 3 é atendido OU se o SQL utiliza AND ou OR entre múltiplos predicados.

Nível 5 = Coleta 128 blocos.

Coleta se o nível 4 é atendido.

Nível 6 = Coleta 256 blocos.

Coleta se o nível 4 é atendido.

Nível 7 = Coleta 512 blocos.

Coleta se o nível 4 é atendido.

Nível 8 = Coleta 1024 blocos.

Coleta se o nível 4 é atendido.

Nível 9 = Coleta 4086 blocos.

Coleta se o nível 4 é atendido.

Nível 10 = Coleta todos os blocos.

Coleta se o nível 4 é atendido.

Nível 11 (Adaptive Dynamic Sampling: >= 11.2.0.4) = Coleta ? Blocos.

Coleta quando ?

(19)

Quando coletar? OPTIMIZER_DYNAMIC_SAMPLING

(20)

Quando coletar? OPTIMIZER_DYNAMIC_SAMPLING

(21)

Como (não) coletar? ANALYZE

SQL> ANALYZE TABLE CUSTOMERS VALIDATE STRUCTURE;

SQL> ANALYZE TABLE CUSTOMERS VALIDATE STRUCTURE CASCADE;

SQL> ANALYZE TABLE CUSTOMERS VALIDATE STRUCTURE CASCADE FAST;

SQL> ANALYZE TABLE CUSTOMERS VALIDATE STRUCTURE CASCADE ONLINE;

SQL> @?/rdbms/admin/utlchain.sql

SQL> ANALYZE TABLE CUSTOMERS LIST CHAINED ROWS INTO CHAINED_ROWS;

(22)

Como (não) coletar? ANALYZE

(23)

Como (não) coletar? ANALYZE

(24)

Como coletar? Opções

ESTIMATE_PERCENT

DBMS_STATS.AUTO_SAMPLE_SIZE / N BLOCK_SAMPLE

FALSE / TRUE DEGREE

NULL / N GRANULARITY

AUTO / ALL / DEFAULT / GLOBAL / GLOBAL AND PARTITION / PARTITION / SUBPARTITION CASCADE

DBMS_STATS.AUTO_CASCADE / TRUE / FALSE OPTIONS

GATHER / GATHER AUTO / GATHER STALE / GATHER EMPTY GATHER_SYS

TRUE / FALSE NO_INVALIDATE

DBMS_STATS.AUTO_INVALIDATE / TRUE / FALSE

(25)

Como coletar? Histogramas

METHOD_OPT

FOR ALL COLUMNS SIZE AUTO

FOR ALL [INDEXED | HIDDEN] COLUMNS SIZE [N | REPEAT | AUTO | SKEWONLY]

FOR COLUMNS column SIZE [N | REPEAT | AUTO | SKEWONLY]

Exemplos:

FOR ALL COLUMNS SIZE 1 FOR ALL COLUMNS SIZE 100 FOR ALL COLUMNS SIZE AUTO FOR ALL COLUMNS SIZE REPEAT FOR ALL COLUMNS SIZE SKEWONLY FOR ALL INDEXED COLUMNS SIZE 1 FOR ALL INDEXED COLUMNS SIZE 100 FOR ALL INDEXED COLUMNS SIZE AUTO FOR ALL INDEXED COLUMNS SIZE REPEAT FOR ALL INDEXED COLUMNS SIZE SKEWONLY FOR COLUMNS C1 SIZE 1

FOR COLUMNS C1 SIZE 100

FOR COLUMNS C1 SIZE AUTO

FOR COLUMNS C1 SIZE REPEAT

FOR COLUMNS C1 SIZE SKEWONLY

(26)

Como coletar? Histogramas

DBA_TAB_COLUMNS / ALL_TAB_COLUMNS / USER_TAB_COLUMNS

DBA_TAB_HISTOGRAMS / ALL_TAB_HISTOGRAMS / USER_TAB_HISTOGRAMS

SELECT H.TABLE_NAME, H.COLUMN_NAME, C.HISTOGRAM, H.ENDPOINT_NUMBER,

H.ENDPOINT_ACTUAL_VALUE, H.ENDPOINT_REPEAT_COUNT FROM USER_TAB_HISTOGRAMS H, USER_TAB_COLUMNS C WHERE H.TABLE_NAME = C.TABLE_NAME AND H.COLUMN_NAME

= C.COLUMN_NAME AND HISTOGRAM <> 'NONE' ORDER BY 1,2,4;

(27)

Como coletar? Histogramas

Buckets: máximo de 254 / 127 (2048 no 12c);

Frequency Histograms;

Height-Balanced Histograms;

Top Frequency Histograms (12c);

Hybrid Histograms (12c).

(28)

Como coletar? Histogramas - Frequency

Utilizados se:

- Se o NDV é menor ou igual que a quantidade de Buckets indicados na coleta;

- É utilizado AUTO_SAMPLE_SIZE na execução da coleta.

(29)

Como coletar? Histogramas – Height Balanced

Utilizados se:

- Se o número de Buckets indicados na coleta é menor que o NDV.

(30)

Como coletar? Histogramas – Top Frequency

Utilizados se:

- Se o NDV é maior que a quantidade de Buckets indicados na coleta;

- É utilizado AUTO_SAMPLE_SIZE na execução da coleta;

- Se o percentual de linhas ocupadas pelos Top Values é igual ou maior que p, sendo

que p = (1-(1/Buckets))*100.

(31)

Como coletar? Histogramas - Hybrid

Utilizados se:

- Se o número de Buckets indicados na coleta é menor que o NDV;

- É utilizado AUTO_SAMPLE_SIZE na execução da coleta;

- Se os critétios para Top Frequency Histograms não se aplicam.

(32)

Quanto coletar? AUTO_SAMPLE ou ESTIMATE_PERCENT

(33)

Quanto coletar? AUTO_SAMPLE ou ESTIMATE_PERCENT

(34)

Outras estatísticas

Extended Statistics – Expression

SQL> SELECT DBMS_STATS.CREATE_EXTENDED_STATS(USER, 'CUSTOMERS') FROM DUAL;

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS ('SH','CUSTOMERS',

METHOD_OPT=>'FOR COLUMNS (LOWER(CUST_STATE_PROVINCE)) SIZE SKEWONLY');

(35)

Outras estatísticas

Fixed Objects Statistics (V$SQL, V$SESSION, etc.)

SQL> EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

Dictionary Statistics (DBA_SEGMENTS, DBA_TABLES, etc.);

SQL> EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

System Statistcs (CPU e I/O)

SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS;

OU

SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('START');

...

SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('STOP');

OU

SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('EXADATA');

(36)

Como coletar?

Controle de Opções

SQL> EXEC DBMS_STATS.SET_DATABASE_PREFS('DEGREE','2');

SQL> EXEC DBMS_STATS.SET_SCHEMA_PREFS('SOE','CASCADE','TRUE');

SQL> EXEC DBMS_STATS.SET_TABLE_PREFS('SOE','CUSTOMERS','STALE_PERCENT',5);

CASCADE

DEGREE

ESTIMATE_PERCENT

GRANULARITY

INCREMENTAL

INCREMENTAL_LEVEL

INCREMENTAL_STALENESS

METHOD_OPT

NO_INVALIDATE

PUBLISH

STALE_PERCENT

TABLE_CACHED_BLOCKS

OPTIONS

(37)

Como coletar?

Coleta geral

EXEC DBMS_STATS.GATHER_DATABASE_STATS

(ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE, BLOCK_SAMPLE=>FALSE,

DEGREE=>8,

GRANULARITY=>'AUTO', CASCADE=>TRUE,

OPTIONS=>'GATHER EMPTY', GATHER_SYS=>FALSE,

NO_INVALIDATE=>FALSE,

METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');

EXEC DBMS_STATS.GATHER_DATABASE_STATS

(ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE, BLOCK_SAMPLE=>FALSE,

DEGREE=>8,

GRANULARITY=>'AUTO', CASCADE=>TRUE,

OPTIONS=>'GATHER STALE', GATHER_SYS=>FALSE,

NO_INVALIDATE=>FALSE,

METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');

(38)

Como coletar?

Coleta por exceção

EXEC DBMS_STATS.UNLOCK_TABLE_STATS('SCOTT','EMP');

EXEC DBMS_STATS.GATHER_TABLE_STATS ('SCOTT', 'EMP',

ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE, BLOCK_SAMPLE=>FALSE,

DEGREE=>16,

GRANULARITY=>'PARTITION', CASCADE=>TRUE,

OPTIONS=>'GATHER', NO_INVALIDATE=>FALSE,

METHOD_OPT=>'FOR COLUMNS EMPNO SIZE REPEAT');

EXEC DBMS_STATS.LOCK_TABLE_STATS('SCOTT','EMP');

(39)

Como coletar? Coleta de exceção

HINT /*+ GATHER_PLAN_STATISTICS */

Parâmetro STATISTICS_LEVEL = ALL

(40)

Como coletar? Coleta de exceção

SQLT (MOS 215187.1)

oratop (MOS 1500864.1)

(41)

Faça um favor para você: Upgrade para 12c!

Performance With Zero Effort

Adaptive Query Optimization

Adaptive SQL Plan Management

Automatic Column Group Detection

Concurrent Statistics Gathering

Dynamic Statistics

Enhanced Parallel Statement Queuing

Enhancements to Incremental Statistics

Enhancements to System Statistics

New Types of Optimizer Statistics

Online Statistics Gathering for Bulk Loads

Out-of-Place Materialized View Refresh

Session-Private Statistics for Global Temporary Tables

SQL Plan Directives

Synchronous Materialized View Refresh

(42)

Resumo

Quando coletar?

Quando ocorre uma alteração significativa (%) nos objetos.

Na maioria dos casos, isto não ocorre todos os dias.

Não espere alguém te avisar: monitore objetos STALE.

Não espere alguém te avisar: monitore diferenças entre E-rows e A-rows.

Reduza o STALE PERCENT em grandes objetos.

Fique atento às alterações que influenciam as Outras Estatísticas.

Quanto coletar?

Do 11gR1 em diante, o AUTO_SAMPLE faz coletas excelentes na maioria dos casos.

Em coleta de exceção, aumente o ESTIMATE_PERCENT em casos onde dados não foram encontrados.

O ESTIMATE_PERCENT proíbe os novos tipos de Histogramas do 12c.

Como coletar?

Cancele a coleta automática. Crie uma coleta manual geral agendada, e a monitore.

Se necessário, crie outra coleta manual de exceção agendada, e monitore.

Na coleta geral, controle o DEGREE de acordo com seu ambiente.

Em coleta de exceção, aumente o DEGREE para grandes objetos.

Em coleta de exceção, altere METHOD_OPT para colunas sensíveis.

Não colete de objetos altamente voláteis. Use OPTIMIZER_DYNAMIC_SAMPLING.

(43)

Não deixe de ler

Oracle Database Online Documentation 12c Release 1: Database New Features Guide http://docs.oracle.com/database/121/NEWFT/toc.htm

Oracle Database Online Documentation 12c Release 1: Database SQL Tuning Guide Managing Optimizer Statistics: Basic Topics

http://docs.oracle.com/database/121/TGSQL/tgsql_stats.htm

Oracle Database Online Documentation 12c Release 1: Database SQL Tuning Guide Managing Optimizer Statistics: Advanced Topics

http://docs.oracle.com/database/121/TGSQL/tgsql_astat.htm Upgrading from 11g to 12c: What to expect from the Optimizer

http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-12c- 1963236.pdf

Understanding Optimizer Statistics in Oracle Database 12c

http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-statistics-concepts-12c- 1963871.pdf

Best Practices For Gathering Optimizer Statistics In Oracle Database 12

http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-

1967354.pdf

(44)

Perguntas?

Ricardo Portilho Proni

ricardo@informatica.com.br

Nerv Informática

Referências

Documentos relacionados

Com a dimensão social da indústria têxtil, o design de moda tem se apresentado em constante crescimento dentre as áreas de interesse do campo acadêmico. Inúmeros cursos de

Este procedimento descreve como ativar o rastreamento em ambos os servidores CTIOS: Anote a máscara de rastreamento atual para uso posterior.. Use o editor do registro para editar

- Maioria das espécies atacam grande número de hospedeiros; - Pode ocorrer diapausa em fêmeas de alguns gêneros em regiões. temperadas = fêmeas laranjas; - Preferência por folhas

A Fundação Educar DPaschoal – investimento social do grupo DPaschoal – foi criada há 18 anos com o objetivo de estimular pessoas a adotarem a educação para a cidadania como

Com base nas competências da certificação OCA Oracle Database 12c, a certificação OCP em Oracle Database 12c inclui o conhecimento avançado e capacidades exigidos aos administradores

Ação de Preparação para Exame 1Z0-061 (Oracle Database 12c: SQL Fundamentals) (3h) Oracle Database 12c: Install and Upgrade Workshop (12h). Oracle Database

Particularmente, o ensino de um conteúdo matemático que nos 2 inquieta é o de Álgebra nos anos finais do ensino fundamental, uma vez que esse recebe bastante atenção por

Oracle Database 11g: Adm Workshop I Oracle Database 11g: Adm Workshop II Oracle Database 11g: Performance Tuning Oracle Database 10g: SQL Tuning..