Download as pdf or txt
Download as pdf or txt
You are on page 1of 188

Oracle Performance Diagnostics & Tuning 12cR2

Em Oracle Enterprise Linux 7.3


Inclui CDB Architecture

Ricardo Portilho Proni


[email protected]

Esta obra est licenciada sob a licena


Creative Commons Atribuio-SemDerivados 3.0 Brasil.
Para ver uma cpia desta licena, visite http://creativecommons.org/licenses/by-nd/3.0/br/.
Comandos no Treinamento
Comando com o usurio root:
# ls -lh

Comando com um usurio de manuteno:


$ sudo ls -lh

Comando com um usurio normal:


$ ls -lh

Adicionar texto a um arquivo:


$ vi initORCL.ora
...
db_cache_size=500M
...

Comando no Oracle:
SQL> SELECT STATUS FROM V$INSTANCE;

Algo deve ser alterado de acordo com sua mquina:


Hostname: nerv01.localdomain

Quando algo d errado propositalmente: 2


O que aconteceu?
rlwrap
# yum -y install
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.r
pm
# yum -y install rlwrap

$ rlwrap sqlplus / AS SYSDBA


$ rlwrap rman TARGET /
$ rlwrap lsnrctl
$ rlwrap dgmgrl SYS/Nerv2017@ORCL

3
Logs
Linux
$ sudo tail -f /var/log/messages

Oracle
$ tail -f
$ORACLE_BASE/diag/rdbms/<database>/<SID>/trace/alert_<SID>.log

4
Multitenant / Singletenant Architecture

5
Deprecation of Non-CDB Architecture

Documentao 12cR1:

Documentao 12cR2:
12cR2 PDB New Features
Subset Standby
Data Guard Broker PDB Migration or Failover
Cross-Platform Import of a Pluggable Database into a Multitenant Container Database
I/O Rate Limits for PDBs
Heat Map and Automatic Data Optimization Support for CDBs
PDB Character Set
PDB Refresh
Hints in CONTAINERS Query
Parallel PDB Creation Clause
PDB Archive Files (.pdb Files)
Default Tablespace Clause
Cloning a PDB
Near Zero Downtime PDB Relocation
Logical Standby Database to Support CDBs with PDBs with Different Character Sets
LogMiner to Support CDBs with PDBs with Different Character Sets
Support for PDBs with Different Character Sets, Time Zone File Versions, and Database Time
Zones in a CDB
Memory Resource Management
Per-Process PGA Limits
Performance Profiles and Mandatory PDB Profiles
CDB-Level PDB Lockdown
12cR2 PDB New Features
Application Root
Proxy PDB
Forwarding Connections to A New Address Based on Service
Service-Level ACLs for TCP Protocol
Flashback Pluggable Database
Upgrading a CDB With One or More PDBs in a Single Operation
Support for Thousands of Pluggable Databases for Each Multitenant Container Database
Pluggable Database Lockdown Profiles Enhancements
Pluggable Database Operating System Credentials
Oracle Enterprise Manager Database Express (EM Express) Resource Manager Support
EM Express: Simplifying Configuration for Multitenant Through Single Port Access
EM Express: Performance Hub Enhancements
Automatic Workload Repository (AWR) Support for a Pluggable Database (PDB)
Selective PDB Upgrades
AWR_PDB_AUTOFLUSH_ENABLED Initialization Parameter
ENABLE_AUTOMATIC_MAINTENANCE_PDB Initialization Parameter
AUTOTASK_MAX_ACTIVE_PDBS Initialization Parameter
Global and Shared Connection Pool for Oracle Cloud and Multitenant Oracle Databases
Prioritized Rebalancing
Oracle Database Vault Common Realms and Command Rules for Oracle Multitenant
Option Multitenant
Multitenant - EE
Singletenant - SE2
CDB, Root, PDBs, Containers
Dicionrio de Dados
Verificao de informaes
Conectando a CDB / PDB
Conectando a CDB / PDB
Conectando a CDB / PDB
Conectando a CDB / PDB
Alterao de Parmetros
Alterao de Parmetros
TABLESPACEs
Usurios e Privilgios
Usurios e Privilgios
Usurios e Privilgios
Backup
CDB e PDBs
RMAN> BACKUP DATABASE;
RMAN> BACKUP DATAFILE 1;
RMAN> BACKUP DATAFILE 1,3;

CDB
RMAN> BACKUP DATABASE ROOT;
RMAN> BACKUP TABLESPACE SYSTEM;
RMAN> BACKUP TABLESPACE SYSTEM,SYSAUX;

PDBs
RMAN> BACKUP PLUGGABLE DATABASE DEV1;
RMAN> BACKUP PLUGGABLE DATABASE DEV1,DEV2;
RMAN> BACKUP TABLESPACE DEV1:SYSTEM;
Restore / Recover
CDB e PDBs
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> RESTORE DATAFILE 1;
RMAN> RECOVER DATAFILE 1;

CDB
RMAN> RESTORE DATABASE ROOT;
RMAN> RECOVER DATABASE ROOT;
RMAN> RESTORE TABLESPACE SYSTEM;
RMAN> RECOVER TABLESPACE SYSTEM;

PDBs
RMAN> RESTORE PLUGGABLE DATABASE DEV1;
RMAN> RECOVER PLUGGABLE DATABASE DEV1;
RMAN> RESTORE TABLESPACE DEV1:USERS;
RMAN> RECOVER TABLESPACE DEV1:USERS;
Restore / Recover
Tuning: Top Ten Mistakes
1 - Bad connection management
2 - Bad use of cursors and the shared pool
3 - Bad SQL
4 - Use of nonstandard initialization parameters
5 - Getting database I/O wrong
6 - Online redo log setup problems
7 - Serialization of data blocks in the buffer cache due to lack of free lists, free list groups,
transaction slots (INITRANS), or shortage of rollback segments.
8 - Long full table scans
9 - High amounts of recursive (SYS) SQL
10 - Deployment and migration errors

Oracle Database Performance Tuning Guide


http://docs.oracle.com/database/121/TGDBA/toc.htm 28 28
Minha abordagem

Performance de Sistemas Computacionais s pode ser medida em TEMPO.

Performance Tuning deve ser reativa.

Performance Tuning deve ter ROI.

Apenas os maiores gargalos devem ser solucionados.

O processo deve ser Diagnostics, e depois Tuning.

Alto consumo de CPU no um problema.

O usurio no executa um SQL por prazer.

O desenvolvedor no deveria saber como fazer um bom SQL (COBOL?).

Ferramentas Grficas / Enterprise Manager / Wizards / Automao so bons auxiliares.

Bancos com bom desempenho devem ser observados.

Conhea outros RDBMSs: TI no lugar para paixes.

No acredite em nada (separar tabelas e ndices?). Teste.

Se houvesse um parmetro que sempre deixasse o Oracle mais rpido, sem nenhum efeito
colateral, ele j viria habilitado.

Desenvolva um mtodo de convencimento gerencial.

Por algo chamar-se Storage, no quer dizer que ele no tenha problemas.

KISS (Keep It Simple, Stupid): a probabilidade de falha cresce linearmente com o aumento de
complexidade.

Saiba dizer No.

Saiba dizer No sei.

29 29
Tempo

30 30
Tempo Computacional

R=S+W

OU

Response Time = Service Time + Wait Time

31 31
Instrumentao: Mainframe

32 32
Instrumentao: Solaris

33 33
Oracle Wait Interface

34 34
Oracle Wait Interface

35 35
Evoluo da OWI

Verso 7.0.12: 104 Wait Events

Verso 8: 140 Wait Events

Verso 8i: 220 Wait Events

Verso 9i: 400 Waits Events

Verso 10gR1: >800 Wait Events

Verso 11gR2: >1100 Wait Events

Verso 12cR1: >1650 Wait Events

36 36
Enterprise Manager

37 37
Wait Classes
Administrative
Application
Cluster
Commit
Concurrency
Configuration
Idle
Network
Other
Queueing
Scheduler
System I/O
User I/O

38 38
Sistema Operacional

39 39
top

40 40
vmstat

41 41
Conceitos Bsicos

42 42
Arquitetura Oracle

43 43
Configurao de Memria

44 44
Configurao de Memria
Automtico AMM (Automatic Memory Management) (>= 11g)
memory_max_target = 16G
memory_target = 16G
sga_target = 0
pga_aggregate_target = 0
pga_aggregate_limit = 2G

Automtico ASMM (Automatic Segment Memory Management) (>= 10g)


memory_max_target = 0
memory_target = 0
sga_max_size = 15G
sga_target = 15G
pga_aggregate_target = 1G
pga_aggregate_limit = 2G

Semi-automtico ASMM (Automatic Segment Memory Management) (>= 10g)


sga_max_size = 15G
sga_target = 15G
pga_aggregate_target = 1G
pga_aggregate_limit = 2G
db_cache_size = 10G

45 45
Configurao de Memria
Manual (>= 9i)
sga_max_size = 15G
db_cache_size = 10G
shared_pool_size = 2G
large_pool_size = 128M
java_pool_size = 128M
streams_pool_size = 128M

46 46
Configurao de Memria
db_block_size = 8192

db_2k_cache_size = 128M
db_4k_cache_size = 128M
db_8k_cache_size = 128M
db_16k_cache_size = 128M
db_32k_cache_size = 128M

db_keep_cache_size = 128M (< 10g: buffer_pool_keep)


db_recycle_cache_size = 128M (<10g: buffer_pool_recycle)
shared_pool_reserved_size = 128M

result_cache_mode = MANUAL
result_cache_max_size = 10M
result_cache_max_result = 5

db_file_multiblock_read_count = 128

log_buffer = 8388608

fast_start_mttr_target = 0

47 47
Compression

10g OLAP

11g OLTP

12c InMemory

48
Lab 1.1: Configurao de Memria

Verifique os parmetros elementares em seu banco de dados.

Altere o parmetro memory_max_target para 0.

Altere o parmetro memory_target para 0.

Altere o parmetro sga_max_size para 800M.

Altere o parmetro sga_target para 0.

Altere o parmetro db_cache_size para 400M.

Altere o parmetro shared_pool_size para 200M.

Altere o parmetro pga_aggregate_target para 100M.

49 49
Granularidades de Anlise

SQL Statement

Session

Instance

50 50
Cenrios de Anlise

H lentido agora.

Tivemos lentido ontem.

51 51
Ferramentas de Anlise

Dynamic Performance Views

Extended SQL Trace (Event 10046)

Statspack / AWR

52 52
Limitaes da OWI

53 53
Limitaes: OWI

No um monitoramento End-to-End

Sem dados de consumo de CPU

Sem dados de consumo de Memria

Bugs

Imprecises

54 54
Limitaes: Views

Sem histrico

55 55
Limitaes: Extended SQL Trace

Muitos dados

Altssima granularidade

Desempenho

Correlao de informaes

Sesses PARALLEL

Sesses SHARED SERVER

Waits s disponveis em >=9iR1

Suporte oficial s em >10gR1

56 56
Limitaes: Statspack / AWR

Baixa granularidade

Apenas histrico

57 57
Lab 2.1: Views
V$SYSTEM_EVENT
V$SESSION_EVENT
V$SESSION_WAIT

Verifique as Dynamic Performance Views da OWI em seu banco de dados.

Quais suas colunas mais importantes?

Que Waits voc tem em seu banco de dados?

Habitue-se a seu contedo.

58 58
Wait Events mais comuns

59 59
Wait Events mais comuns

buffer busy

free buffer

read by oher session

control file single write / control file parallel write / control file sequential read

db file single write / db file parallel read / db file parallel write

db file scatteread read / db file sequential read

direct path read / direct path write

enqueue

free buffer

latch free / latch: library cache / latch: cache buffers chains

library cache pin / library cache lock

log buffer space

log file parallel write / log file single write / log file sequential read

log file switch (archiving needed)

log file switch (checkpoint incomplete) / log file switch completion

log file sync

SQL*Net message from client / SQL*Net message to client

SQL*Net more data from client / SQL*Net more data to client

SQL*Net break/reset from client / SQL*Net break/reset to client

60 60
Lab 3.1: Gravaes
Habilite o usurio SCOTT.
SQL> ALTER USER SCOTT ACCOUNT UNLOCK IDENTIFIED BY TIGER;
SQL> GRANT SELECT ANY DICTIONARY TO SCOTT;

Abra uma sesso com o SCOTT com SET TIMING ON.


SQL> CONN SCOTT/TIGER
SQL> SET TIMING ON

Em outra sesso, com o SYS, verifique (vrias vezes seguidas) o contedo


da V$SESSION_WAIT durante a execuo dos comandos do SCOTT a
seguir.

Com o usurio SCOTT, crie uma tabela de testes.


SQL> CREATE TABLE T AS SELECT * FROM ALL_OBJECTS;
SQL> INSERT INTO T SELECT * FROM T; Execute 8 vezes.
SQL> COMMIT;

6161
Lab 3.2: Gravaes
Feche e abra a sesso com o SCOTT com SET TIMING ON
SQL> CONN SCOTT/TIGER
SQL> SET TIMING ON

Em outra sesso, com o SYS, verifique o contedo da V$SESSION_EVENT


relacionado a sesso do SCOTT.
SQL> SELECT SID FROM V$SESSION WHERE USERNAME = 'SCOTT';
SQL> SELECT EVENT, TOTAL_WAITS, TOTAL_TIMEOUTS, AVERAGE_WAIT FROM
V$SESSION_EVENT WHERE SID = 17 ORDER BY 4;

Com o usurio SCOTT, duplique a grande tabela.


SQL> CREATE TABLE T2 AS SELECT * FROM T;

Na sesso do SYS, aps a duplicao da tabela, verifique novamente o


contedo da V$SESSION_EVENT relacionado a sesso do SCOTT

Remova a tabela T2, feche e abra a sesso com o SCOTT, e repita a


operao. Durante a repetio da operao, verifique as mudanas do
contedo da V$SESSION_EVENT relacionado a sesso do SCOTT.

62 62
Lab 3.3: Gravaes
Responda as seguintes perguntas:
- Onde foi gasto mais tempo nesta sesso?
- A que se referem os maiores Wait Events?
- Qual dos maiores Wait Events podem ser reduzidos?
- A eliminao de um Wait Event que pode ser reduzido, causar uma melhoria de quanto tempo?
- Como reduzir este Wait Event?

Corrija a causa deste Wait Event.

Remova a tabela T2, feche e abra a sesso com o SCOTT, e repita a operao.

63 63
Extended SQL Trace

64 64
Extended SQL Trace: Ativao

Em toda a instncia

Em sua sesso

Em outra sesso

65 65
Extended SQL Trace: Nveis
0 - Trace OFF
2 - Regular SQL Trace
4 - Nvel 2, + Bind Variable
8 - Nvel 2 + Wait Events
12 - Nvel 2, + Bind Variable + Wait Events

66
Extended SQL Trace: Ativao
Todas verses:
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
SQL> ALTER SESSION SET SQL_TRACE=FALSE;

SQL> EXEC DBMS_SESSION.SET_SQL_TRACE(SQL_TRACE => TRUE);


SQL> EXEC DBMS_SESSION.SET_SQL_TRACE(SQL_TRACE => FALSE);

SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION


(SID=>123, SERIAL#=>1234, SQL_TRACE=>TRUE);
SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION
(SID=>123, SERIAL#=>1234, SQL_TRACE=>FALSE);

SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';

SQL> EXEC DBMS_SYSTEM.SET_EV(SI=>123, SE=>1234, EV=>10046, LE=>12, NM=>'');


SQL> EXEC DBMS_SYSTEM.SET_EV(SI=>123, SE=>1234, EV=>10046, LE=>0, NM=>'');

67
Extended SQL Trace: Ativao
Verses >= 8I
SQL> SELECT P.SPID OS_PROCESS_ID
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR AND S.USERNAME = 'SCOTT';
SQL> ORADEBUG SETOSPID 12345;
SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12;
SQL> ORADEBUG TRACEFILE_NAME;
SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF;

68
Extended SQL Trace: Ativao
Todas verses:
SQL> EXEC DBMS_SUPPORT.START_TRACE(WAITS=>TRUE, BINDS=>FALSE);
SQL> EXEC DBMS_SUPPORT.STOP_TRACE;

SQL> EXEC DBMS_SUPPORT.START_TRACE_IN_SESSION


(SID=>123, SERIAL=>1234, WAITS=>TRUE, BINDS=>TRUE);
SQL> EXEC DBMS_SUPPORT.STOP_TRACE_IN_SESSION (SID=>123, SERIAL=>1234);

Verses >= 10G


SQL> EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE
(SESSION_ID =>1234, SERIAL_NUM=>1234, WAITS=>TRUE, BINDS=>FALSE);
SQL> EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE (SESSION_ID=>1234, SERIAL_NUM=>1234);

SQL> EXEC DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE


(CLIENT_ID=>'PORTILHO', WAITS=>TRUE, BINDS=>TRUE);
SQL> EXEC DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE(CLIENT_ID=>'PORTILHO');

SQL> EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE


(SERVICE_NAME=>'OLTP', MODULE_NAME=>'TESTE', ACTION_NAME=>'RUNNING',
WAITS=>TRUE, BINDS=>TRUE);
SQL> EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE
(SERVICE_NAME=>'OLTP', MODULE_NAME=>'TESTE', ACTION_NAME=>'RUNNING');

SQL> ALTER SESSION SET EVENTS 'trace[rdbms.SQL_Optimizer.*][sql:sql_id]';

69
Extended SQL Trace: Ativao
CREATE OR REPLACE TRIGGER SET_TRACE AFTER LOGON ON DATABASE
BEGIN
IF USER IN ('SCOTT') THEN

EXECUTE IMMEDIATE
'ALTER SESSION SET TRACEFILE_IDENTIFIER=''SESSAO_RASTREADA_PORTILHO''';
EXECUTE IMMEDIATE
'ALTER SESSION SET TIMED_STATISTICS=TRUE';
EXECUTE IMMEDIATE
'ALTER SESSION SET MAX_DUMP_FILE_SIZE=UNLIMITED';
EXECUTE IMMEDIATE
'ALTER SESSION SET EVENTS ''10046 TRACE NAME CONTEXT FOREVER, LEVEL 12''';

END IF;
END;
/

70
Extended SQL Trace: Ativao
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';

OU

SQL> SELECT P.SPID, P.TRACEFILE


FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR AND S.USERNAME = 'SCOTT';
SQL> oradebug setospid 9999;
SQL> oradebug tracefile_name;
SQL> oradebug unlimit;
SQL> oradebug event 10046 trace name context forever, level 12;

71
Extended SQL Trace: tkprof
$ tkprof
Usage: tkprof tracefile outputfile [explain= ] [table= ]
[print= ] [insert= ] [sys= ] [sort= ]
table=schema.tablename Use 'schema.tablename' with 'explain=' option.
explain=user/password Connect to ORACLE and issue EXPLAIN PLAN.
print=integer List only the first 'integer' SQL statements.
aggregate=yes|no
insert=filename List SQL statements and data inside INSERT statements.
sys=no TKPROF does not list SQL statements run as user SYS.
record=filename Record non-recursive statements found in the trace file.
waits=yes|no Record summary for any wait events found in the trace file.
sort=option Set of zero or more of the following sort options:
prscnt number of times parse was called
prscpu cpu time parsing
prsela elapsed time parsing
prsdsk number of disk reads during parse
prsqry number of buffers for consistent read during parse
prscu number of buffers for current read during parse
prsmis number of misses in library cache during parse
...

72
Extended SQL Trace: tkprof

73
Extended SQL Trace: SQL Developer

74
Lab 4.1: Extended SQL Trace
Feche e abra a sesso com o SCOTT com SET TIMING ON
SQL> EXIT
$ sqlplus SCOTT/TIGER
SQL> SET TIMING ON

Com o usurio SYS, habilite o Extended Trace para a sesso do SCOTT:


SQL> SELECT P.SPID
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR AND S.USERNAME = 'SCOTT';
SQL> oradebug setospid 8708;
SQL> oradebug tracefile_name;
SQL> oradebug unlimit;
SQL> oradebug event 10046 trace name context forever, level 12;

Em outro terminal, verifique o contedo do Trace.


$ tail -f /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_8708.trc

75 75
Lab 4.2: Extended SQL Trace
Com o usurio SCOTT, apague o contedo da grande tabela, altere o valor
do parmetro db_file_multiblock_read_count (apenas na sesso) e reinsira
os dados.
SQL> TRUNCATE TABLE T2;
SQL> ALTER SESSION SET db_file_multiblock_read_count = 8;
SQL> INSERT INTO T2 SELECT * FROM T;
SQL> COMMIT;

Continue verificando o contedo do Trace durante a execuo da operao.

Ao trmino da execuo, verifique os valores de V$SESSION_EVENT da


sesso do SCOTT. Guarde este resultado.

Execute o tkprof nos Trace gerado.


$ tkprof /u01/app/oracle/diag/rdbms/test11gr2/TEST11GR2/trace/TEST11GR2_ora_8708.trc

Analise o relatrio gerado pelo tkprof.


Repita a operao, mas sem os REDO LOGs de 1G.
Repita a operao, mas com db_file_multiblock_read_count de 50 e 1000.

76 76
Lendas do Oracle

77 77
RAM x SGA
No utilizars mais que 50% de tua RAM para a SGA.
[ricardo@Melquior ~]$ free
total used free shared buffers cached
Mem: 3719480 3262932 456548 797828 6308 1094712
-/+ buffers/cache: 2161912 1557568
Swap: 16777212 764576 16012636

[ricardo@Melquior ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 443G 325G 96G 78% /
tmpfs 1.8G 2.3M 1.8G 1% /dev/shm
[ricardo@Melquior ~]$

RAM Total do Servidor


- (quantidade mxima de conexes simultneas + 40) x 2MB
- Memria do Sistema Operacional
= (OLTP) 80% SGA e 20% PGA OU
= (OLAP) 80% PGA e 20% SGA

78 78
SWAP
Ters uma rea de SWAP com o dobro de tua RAM.

79 79
Checkpoint
Teus DATAFILEs devero ter no mximo 2GB / 10GB / xGB.
Eventos relacionados

control file single write

control file parallel write

control file sequential read

db file single write

Checkpoints:

Full Checkpoint

Thread Checkpoint

File Checkpoint

Object Checkpoint

Parallel Checkpoint

Incremental Checkpoint

Checkpoint Log Switch

80 80
UNDO
Devers executar COMMIT a cada N linhas.
Qual a transao mais longa que o sistema deve suportar?
UNDO_RETENTION
CREATE UNDO TABLESPACE RETENTION GUARANTEE
AUTOEXTEND ON

81 81
Lendas do Oracle

Todo teu SELECT dever utilizar um ndice, para que ele seja rpido.

Utilizars HINTs, pois tu s mais sbio que o Oracle.

Se coletar estatsticas em 100%, os planos de execuo sero perfeitos.

No coletars estatsticas do dicionrio de dados.

Devers separar teus dados e ndices.

Devers separar teus dados em diversas TABLESPACEs.

No habilitars AUTOEXTEND ON.

Utilizars RAID 5, pois mais rpido para leituras.

Colocar os Redo Logs em SSD (ODA?).

No permitirs mais que um SWITCH a cada 20 minutos.

Mas no ters grandes REDO LOGs.

Executars REBUILD de ndices regularmente.

Executars MOVE de tabelas regularmente.

Se grande a tabela tornar-se, a particionars.

Se quiseres mais velocidade, usars RAC.

Quanto mais CPUs, mais rpido teu banco de dados ser.

Se teus RATIOS estiverem altos, felizes estaro teus usurios.

Sempre que possvel, aumentars seu DB_CACHE_SIZE e SHARED_POOL.

Se os dados esto na memria, tudo ser rpido.

O Exadata resolve todos os problemas de desempenho.

Desabilitars o AWR / STATSPACK, pois ele causa lentido.

No utilizars memria automtica. Tu s mais sbio que o Oracle.

Se usar, deixars a SGA_TARGET um pouco menor que a SGA_MAX_SIZE.

AUTOMATIC SQL TUNING um dos cavaleiros do apocalipse.

82 82
Wait Events - Monitorao

83 83
V$SESSION_WAIT
SELECT W.SID, W.EVENT, W.SECONDS_IN_WAIT, SQL.SQL_TEXT
FROM GV$SESSION_WAIT W,
GV$SESSION S,
GV$PROCESS P,
GV$SQLTEXT SQL
WHERE W.SID = S.SID
AND S.PADDR = P.ADDR
AND SQL.ADDRESS = S.SQL_ADDRESS
AND SQL.HASH_VALUE = S.SQL_HASH_VALUE
AND W.WAIT_CLASS != 'Idle'
AND W.INST_ID = S.INST_ID
AND W.INST_ID = P.INST_ID
AND W.INST_ID = SQL.INST_ID
ORDER BY W.SECONDS_IN_WAIT, W.SID, SQL.PIECE;

84 84
V$SESSION_EVENT
SELECT EVENT, SUM(TIME_WAITED)
FROM V$SESSION_EVENT
WHERE WAIT_CLASS != 'Idle'
AND SID IN
(SELECT SID FROM V$SESSION WHERE USERNAME IS NOT NULL)
GROUP BY EVENT
ORDER BY 2;

SELECT EVENT, SUM(TIME_WAITED)


FROM V$SESSION_EVENT
WHERE WAIT_CLASS != 'Idle'
AND SID IN
(SELECT SID FROM V$SESSION WHERE USERNAME IS NULL)
GROUP BY EVENT
ORDER BY 2;

85 85
V$SYSTEM_EVENT
CREATE TABLE PRE_SYSTEM_EVENT AS SELECT * FROM V$SYSTEM_EVENT;
EXECUTE DBMS_LOCK.SLEEP(60);
CREATE TABLE POS_SYSTEM_EVENT AS SELECT * FROM V$SYSTEM_EVENT;

SELECT A.EVENT, A.TIME_WAITED, B.TIME_WAITED, (B.TIME_WAITED-


A.TIME_WAITED) DIFF
FROM PRE_SYSTEM_EVENT A, POS_SYSTEM_EVENT B
WHERE A.EVENT = B.EVENT
AND A.TIME_WAITED IS NOT NULL
AND ((B.TIME_WAITED-A.TIME_WAITED) > 0)
AND A.WAIT_CLASS != 'Idle'
ORDER BY DIFF;

DROP TABLE PRE_SYSTEM_EVENT;


DROP TABLE POS_SYSTEM_EVENT;

86 86
oratop
$ /home/oracle/oratop.RDBMS_12.1_LINUX_X64 -h
$ /home/oracle/oratop.RDBMS_12.1_LINUX_X64 / AS SYSDBA
$ /home/oracle/oratop.RDBMS_12.1_LINUX_X64 -f -i2 / AS SYSDBA

87 87
Wait Events - Detalhes

88 88
Referncia

89 89
Performance Tuning Guide

90 90
Performance Tuning Guide

91 91
MOS

92 92
OWI: Fontes de Consulta
Oracle Database Reference (explicao simples, direta)
http://docs.oracle.com/database/121/REFRN/waitevents003.htm#BGGIBDJI

Oracle Database Performance Tuning Guide (explicao melhor, orientada a


causas / solues)
http://docs.oracle.com/database/121/TGDBA/pfgrf_instance_tune.htm#TGDBA94497

MOS / My Oracle Support / Metalink (vrias notas sobre Wait Events especficos)
https://support.oracle.com/

Livro "Oracle Wait Interface"


http://www.amazon.com/Oracle-Wait-Interface-Performance-Diagnostics/dp/007222729X

93 93
buffer busy
Explicao: O bloco solicitado est em uso, pois outra sesso est carregando o
bloco para o DB_CACHE_SIZE, ou outra sesso est utilizando o bloco no
DB_CACHE_SIZE em um modo incompatvel.
Causa: DB_CACHE_SIZE insuficiente, ou SQL ineficiente.
Correo: Aumente o DB_CACHE_SIZE ou altere o SQL.

P1: Nmero do DATAFILE.


P2: Nmero do bloco.
P3: ID a solicitao vem de diferentes locais da sesso.

94 94
buffer busy

95 95
free buffer
Explicao: O RDBMS aguarda blocos de DB_CACHE_SIZE livres.
Causa: DB_CACHE_SIZE insuficiente.
Correo: Aumente o DB_CACHE_SIZE.

P1: Nmero do DATAFILE.


P2: Nmero do bloco.

96 96
read by other session
Explicao: O bloco solicitado est em uso, pois outra sesso est carregando o
bloco para o DB_CACHE_SIZE, ou outra sesso est utilizando o bloco no
DB_CACHE_SIZE em um modo incompatvel.
Causa: DB_CACHE_SIZE insuficiente, ou SQL ineficiente.
Correo: Aumente o DB_CACHE_SIZE ou altere o SQL.

P1: Nmero do DATAFILE.


P2: Nmero do bloco.
P3: Razo (<10g).
P3: Wait Class (>=10g).

97 97
control file parallel write
Explicao: Espera de I/O para gravar em CONTROLFILEs.
Causa: Excesso de gravao nos CONTROLFILEs ou I/O ineficiente.
Correo: Minimize as gravaes nos CONTROLFILEs ou melhore o mecanismo
de I/O.

P1: Quntidade de CONTROLFILEs.


P2: Quantidade de blocos.
P3: Quantidade de solicitaes de I/O.

98 98
control file single write
Explicao: Espera de I/O para gravar em CONTROLFILEs.
Causa: Excesso de gravao nos CONTROLFILEs ou I/O ineficiente.
Correo: Minimize as gravaes nos CONTROLFILEs ou melhore o mecanismo
de I/O.

P1: Nmero do CONTROLFILE.


P2: Nmero do bloco.
P3: Quantidade de blocos.

99 99
control file sequential read
Explicao: Espera de I/O para ler os CONTROLFILEs.
Causa: Excesso de leitura nos CONTROLFILEs ou I/O ineficiente.
Correo: Minimize as leituras nos CONTROLFILEs ou melhore o mecanismo de
I/O.

P1: Nmero do CONTROLFILE.


P2: Nmero do bloco.
P3: Quantidade de blocos.

100 100
db file parallel write
Explicao: Gravaes de dados nos DATAFILEs esperam pelo I/O.
Causa: Excesso de gravaes ou lentido de I/O.
Correo: Minimize as gravaes ou melhore o mecanismo de I/O.

P1: Quantidade de requisies.


P2: Interrupt.
P3: Timeout.

101 101
db file single write
Explicao: Uma gravao no HEADER do DATAFILE espera pelo I/O.
Causa: Excesso de gravaes no HEADER dos DATAFILEs ou lentido de I/O.
Correo: Minimize as gravaes no HEADER dos DATAFILEs ou melhore o
mecanismo de I/O.

P1: Quantidade de requisies.


P2: Interrupt.
P3: Timeout.

102 102
db file parallel read
Explicao: Durante RECOVER ou durante PREFETCHING, leituras de
DATAFILEs esperam pelo I/O.
Causa: RECOVER muito longo, PREFETCHING excessivo, ou lentido de I/O.
Correo: Acelere o RECOVER, minimize o PREFETCHING, ou melhore o
mecanismo de I/O.

P1: Quantidade de DATAFILEs.


P2: Quantidade de blocos.
P3: Quantidade de requisies.

103 103
User I/O

104 104
MBRC: scatteread / sequential
Em db file scatteread read ocorre db file sequential read quando:
- O bloco j est no cache;
- O bloco est no final do Extent;
- Excede o limite do sistema operacional;
- UNDO.

105
Configurao do CBO - OLTP

OPTIMIZER_MODE (FIRST_ROWS_n / ALL_ROWS)

< DB_FILE_MULTIBLOCK_READ_COUNT

RESULT_CACHE

INMEMORY

OPTIMIZER_SECURE_VIEW_MERGING

QUERY_REWRITE_ENABLED

QUERY_REWRITE_INTEGRITY

STAR_TRANSFORMATION_ENABLED

GATHER_SYSTEM_STATISTICS

GATHER_DATABASE_STATISTICS

OPTIMIZER_DYNAMIC_SAMPLING

WORKAREA_SIZE_POLICY (AUTO / MANUAL)

AUTO: PGA_AGGREGATE_TARGET

MANUAL: BITMAP_MERGE_AREA_SIZE
HASH_AREA_SIZE
SORT_AREA_SIZE
SORT_AREA_RETAINED_SIZE

> OPTIMIZER_INDEX_CACHING

< OPTIMIZER_INDEX_COST_ADJ

Histograms

Extended Statistics

106
Configurao do CBO - OLAP

OPTIMIZER_MODE (FIRST_ROWS_n / ALL_ROWS)

> DB_FILE_MULTIBLOCK_READ_COUNT

RESULT_CACHE

INMEMORY

OPTIMIZER_SECURE_VIEW_MERGING

QUERY_REWRITE_ENABLED

QUERY_REWRITE_INTEGRITY

STAR_TRANSFORMATION_ENABLED

GATHER_SYSTEM_STATISTICS

GATHER_DATABASE_STATISTICS

OPTIMIZER_DYNAMIC_SAMPLING

WORKAREA_SIZE_POLICY (AUTO / MANUAL)

AUTO: PGA_AGGREGATE_TARGET

MANUAL: BITMAP_MERGE_AREA_SIZE
HASH_AREA_SIZE
SORT_AREA_SIZE
SORT_AREA_RETAINED_SIZE

< OPTIMIZER_INDEX_CACHING

> OPTIMIZER_INDEX_COST_ADJ

Histograms

Extended Statistics

107
db file scattered read
Explicao: Durante FTS, leituras de DATAFILEs esperam pelo I/O.
Causa: DB_CACHE_SIZE insuficiente, FTS desnecessrio ou lentido de I/O
Correo: Aumente o DB_CACHE_SIZE, elimine o FTS, ou melhore o
mecanismo de I/O.

P1: Nmero do DATAFILE.


P2: Bloco inicial.
P3: Quantidade de blocos.

108 108
db file sequential read
Explicao: Durante a leitura de um bloco, leituras de DATAFILEs esperam pelo
mecanismo de I/O.
Causa: DB_CACHE_SIZE insuficiente, leitura desnecessria ou lentido de I/O
Correo: Aumente o DB_CACHE_SIZE, elimine a leitura desnecessria, ou
melhore o mecanismo de I/O.

P1: Nmero do DATAFILE.


P2: Bloco inicial.
P3: Quantidade de blocos.

109 109
direct path read / direct path write
Explicao: Leitura / gravao entre DATAFILEs / TEMPFILEs e PGA.
Causa: PGA insuficiente, ou lentido de I/O.
Correo: Aumente a PGA, ou melhore o mecanismo de I/O.

P1: Nmero do arquivo (DATAFILE ou TEMPFILE).


P2: Bloco inicial.
P3: Quantidade de blocos.

110 110
enqueue
Explicao: Mecanismo de fila ordenada do RDBMS.
Causa: Diversas, dependendo do tipo de fila.
Correo: Diversas, dependendo do tipo de fila.

P1: Tipo ou modo da enqueue.


P2: ID1 (como na V$LOCK).
P3: ID2 (como na V$LOCK).

Problemas mais comuns:

TX, Transaction (80%)

TM, DML Enqueue (10%)

HW, High-Water Lock (1%)

SQ, Sequence Number Enqueue (1%)

CF, Controlfile Transaction (0.1%)

111 111
latch free
Explicao: Mecanismo de fila desordenada do RDBMS.
Causa: Diversas, dependendo do tipo de fila.
Correo: Diversas, dependendo do tipo de fila.

P1: Endereo da Latch (como na V$LATCH).


P2: Nmero da Latch (como na V$LATCH).
P3: Quantidade de tentativas.

Problemas mais comuns:

shared pool (40%)

library cache (40%)

cache buffers lru chain (5%)

cache buffers chains (5%)

row cache objects (1%)

112 112
library cache pin / library cache lock
Explicao: Uso incompatvel do objeto entre duas sesses.
Causa: Uso do objeto de forma incompatvel entre duas sesses.
Correo: Finalizar o uso do objeto por uma das sesses.

P1: Endereo do objeto.


P2: Endereo do load lock.
P3: Mode + Namespace.

SQL> SELECT /*+ ORDERED */ W1.SID WAITING_SESSION, H1.SID HOLDING_SESSION,


W.KGLLKTYPE LOCK_OR_PIN, W.KGLLKHDL ADDRESS,
DECODE(H.KGLLKMOD,0,None,1,Null,2,Share,3,Exclusive,'Unknown) MODE_HELD,
DECODE(W.KGLLKREQ,0,None,1,Null,2,Share,3,Exclusive,'Unknown) MODE_REQUESTED
FROM DBA_KGLLOCK W, DBA_KGLLOCK H, V$SESSION W1, V$SESSION H1 WHERE
(((H.KGLLKMOD != 0) AND (H.KGLLKMOD != 1) AND ((H.KGLLKREQ = 0) OR (H.KGLLKREQ = 1)))
AND (((W.KGLLKMOD = 0) OR (W.KGLLKMOD= 1)) AND ((W.KGLLKREQ != 0) AND (W.KGLLKREQ !=
1)))) AND W.KGLLKTYPE = H.KGLLKTYPE AND W.KGLLKHDL = H.KGLLKHDL AND W.KGLLKUSE =
W1.SADDR AND H.KGLLKUSE = H1.SADDR;

SQL> SELECT TO_NAME FROM V$OBJECT_DEPENDENCY WHERE TO_ADDRESS =


0700000010F62750';

113 113
log buffer space
Explicao: Mais espao no LOG_BUFFER necessrio para gravaes.
Causa: LOG_BUFFER insuficiente, REDO LOGs insuficientes, ou I/O lento.
Correo: Aumente o LOG_BUFFER, aumente a quantidade / tamanho de
REDO LOGs, ou melhore o mecanismo de I/O.

P1: Quantidade de REDO LOGs.


P2: Quantidade de blocos do sistema operacional.
P3: Quantidade de requisies de I/O.

114 114
log file parallel write
Explicao: Durante gravao de REDO LOGs, o LGWR espera pelo I/O.
Causa: Excesso de membros nos grupos de REDO LOGs ou lentido de I/O.
Correo: Reduza a quantidade de membros nos grupos de REDO LOGs ou
melhore o mecanismo de I/O.

P1: Quantidade de REDO LOGs.


P2: Quantidade de blocos de sistema operacional.
P3: Quantidade de requisies de I/O.

115 115
log file single write
Explicao: Durante gravao no HEADER de um REDO LOGs, o LGWR
espera pelo I/O.
Causa: Excesso de gravaes no HEADER do REDO LOG ou lentido de I/O.
Correo: Reduza a quantidade de gravaes no HEADER do REDO LOG ou
melhore o mecanismo de I/O.

P1: Nmero do REDO LOG.


P2: Nmero do bloco.
P3: Quantidade de blocos.

116 116
log file sequential read
Explicao: Durante leitura de REDO LOGs, o LGWR espera pelo I/O.
Causa: Lentido de I/O.
Correo: Melhore o mecanismo de I/O.

P1: Nmero do REDO LOG.


P2: Nmero do bloco.
P3: Quantidade de blocos.

117 117
log file switch
Explicao: Todos os grupos de REDO LOGs foram utilizados e ainda so
necessrios para um eventual RECOVER, pois o ARCn ainda no criou os
ARCHIVED REDO LOGs e o DBWR ainda no gravou seu contedo nos
DATAFILEs.
Causa: REDO LOGs sub-dimensionados, configurao inadequada de destino
de ARCHIVED REDO LOGs ou I/O ineficiente.
Correo: Aumentar os REDO LOGs em quantidade e/ou tamanho, corrigir a
configurao de destino do ARCn, ou melhorar o mecanismo de I/O.

P1: No utilizado.
P2: No utilizado.
P3: No utilizado.

Variaes:

log file switch (clearing log file)

log file switch (archiving needed)

log file switch (checkpoint incomplete)

log file switch (private strand flush incomplete)

log file switch completion

118 118
log file sync
Explicao: Um CHECKPOINT foi executado, e precisa ser registrado no REDO
LOG, e o LGRW est aguardando pelo mecanismo de I/O.
Causa: COMMIT em quantidade excessiva, ou I/O ineficiente.
Correo: Reduzir a quantidade de COMMITs ou otimizar o mecanismo de I/O.

P1: Nmero do Log Buffer.


P2: No utilizado.
P3: No utilizado.

119 119
SQL*Net message to / from client
Explicao: Espera durante comunicao via rede com o protocolo SQL*Net.
Causa: Sesso inativa, latncia de rede ou limitao do cliente.
Correo: Eliminar a sesso inativa, minimizar a latncia na rede ou minimizar a limitao
do cliente.

P1: Driver de rede.


P2: Quantidade de bytes.
P3: No utilizado.

Variaes

SQL*Net message from client

SQL*Net message to client

SQL*Net more data from client

SQL*Net more data to client

SQL*Net break/reset to client

SQL*Net message from dblink

SQL*Net message to dblink

SQL*Net more data from dblink

SQL*Net more data to dblink

SQL*Net break/reset to dblink

120 120
Lab 5.1: LGWR x DBWR
Feche e abra a sesso com o SCOTT com SET TIMING ON
SQL> CONN SCOTT/TIGER
SQL> SET TIMING ON

Com o usurio SCOTT, apague o contedo da grande tabela, e reinsira os


dados.
SQL> TRUNCATE TABLE T2;
SQL> INSERT INTO T2 SELECT * FROM T;
SQL> COMMIT;

Ao trmino da execuo, verifique os valores de V$SESSION_EVENT da sesso


do SCOTT. Guarde o resultado.

Altere o valor do parmetro log_buffer para 512k, repita a operao, e compare.


Altere o valor do parmetro log_buffer para 10m, repita a operao, e compare.
Altere o valor do parmetro log_buffer para 100m, repita a operao, e compare.
Mantenha log_buffer com a configurao mais otimizada.
Altere o parmetro FAST_START_MTTR_TARGET para 1, repita a operao, e
compare.

121
Parallel SQL

122 122
Parallel SQL
Permite Query, DML e DDL.

Um objeto pode ter Parallel permanente, independente do SQL:


SQL> ALTER TABLE SCOTT.T PARALLEL 4;

O Parallel SQL pode ser utilizado diretamente no SQL:


SQL> SELECT /*+ PARALLEL(T2 4) */ COUNT(*) FROM T2;
SQL> SELECT /*+ PARALLEL(T2 4,2) */ COUNT(*) FROM T2;

123 123
Parallel SQL
Parmetros:
PARALLEL_MAX_SERVERS = De 0 a 3600.
PARALLEL_MIN_SERVERS = Nmero entre 0 e PARALLEL_MAX_SERVERS.
PARALLEL_MIN_PERCENT = De 0 a 100.

PARALLEL_DEGREE_POLICY = MANUAL, LIMITED ou AUTO.


PARALLEL_MIN_TIME_THRESHOLD = AUTO | Segundos.
PARALLEL_ADAPTIVE_MULTI_USER = true ou false.
PARALLEL_DEGREE_LIMIT = CPU, IO ou Nmero.
PARALLEL_SERVERS_TARGET = Nmero entre 0 e PARALLEL_MAX_SERVERS.
PARALLEL_THREADS_PER_CPU = Qualquer nmero.

PARALLEL_EXECUTION_MESSAGE_SIZE = De 2148 a 32768

PARALLEL_FORCE_LOCAL = true ou false.


PARALLEL_INSTANCE_GROUP = Oracle RAC service_name ou group_name.

PARALLEL_AUTOMATIC_TUNING: Deprecated.
PARALLEL_IO_CAP_ENABLED = Deprecated.

124 124
Lab 6.1: Design de Aplicao
Abra a sesso com o SCOTT com SET TIMING ON.
Em seguida, faa um SELECT da tabela toda.
$ sqlplus SCOTT/TIGER
SQL> SET TIMING ON
SQL> SELECT COUNT(*) FROM T;

Ao trmino da execuo, verifique os valores de V$SESSION_EVENT da


sesso do SCOTT. Guarde o resultado.

Repita a operao com PARALLEL, e compare.


SQL> SELECT /*+ PARALLEL(T 4) */ COUNT(*) FROM T;
SQL> SELECT /*+ PARALLEL(T 20) */ COUNT(*) FROM T;

125 125
Paralelismo
SQL> SELECT SID, SERIAL#, QCSID, QCSERIAL# FROM V$PX_SESSION;

SID SERIAL# QCSID QCSERIAL#


---------- ---------- ---------- ----------
202 5249 12 387
20 3587 12 387
75 4043 12 387
141 233 12 387
204 751 12 387
16 229 12 387
73 3279 12 387
137 403 12 387
203 1137 12 387
18 103 12 387
79 5 12 387
134 3431 12 387
206 5 12 387
19 5 12 387
76 31 12 387
140 5 12 387
12 387 12

126 126
Lab 6.2: Design de Aplicao
Crie esta tabela com o usurio SCOTT:
SQL> CREATE TABLE T3 (NUMERO NUMBER);

Observe o contedo dos seguintes scripts Perl, os execute, e compare:


$ time perl /home/oracle/CommitBAD_BindsBAD.pl
$ time perl /home/oracle/CommitBAD_BindsGOOD.pl
$ time perl /home/oracle/CommitGOOD_BindsBAD.pl
$ time perl /home/oracle/CommitGOOD_BindsGOOD.pl

127 127
Lab 6.3: Design de Aplicao
1a Sesso: 2a Sesso:
SQL> CREATE BITMAP INDEX
IDX_BITMAP_T3 ON T3(NUMERO);

SQL> INSERT INTO T3 VALUES (1); SQL> INSERT INTO T3 VALUES (10);

SQL> COMMIT; SQL> COMMIT;

SQL> INSERT INTO T3 VALUES (1); SQL> INSERT INTO T3 VALUES (1);

SQL> COMMIT; COMMIT;

SQL> INSERT INTO T3 VALUES (1); SQL> INSERT INTO T3 VALUES (10);

SQL> INSERT INTO T3 VALUES (10); SQL> INSERT INTO T3 VALUES (1);

128 128
BITMAP x BTREE
SQL> SELECT COUNT(*) FROM T; - - Sem ndice.
COUNT(1)
-
10936000

SQL> SELECT COUNT(DISTINCT(OWNER)) FROM T; - - Sem ndice.


COUNT(DISTINCT(OWNER))
-
28
Decorrido: 00:00:26.75

SQL> SELECT COUNT(DISTINCT(OWNER)) FROM T; - - Com ndice BTREE.


COUNT(DISTINCT(OWNER))
-
28
Decorrido: 00:00:05.29

SQL> SELECT COUNT(DISTINCT(OWNER)) FROM T; - - Com ndice BITMAP.


COUNT(DISTINCT(OWNER))
-
28
Decorrido: 00:00:01.84

129 129
BITMAP x BTREE
SQL> SELECT COUNT(*) FROM T;
COUNT(1)
-
10936000

SQL> SELECT COUNT(DISTINCT(OWNER)) FROM T;


COUNT(DISTINCT(OWNER))
-
28

SQL> SELECT COUNT(DISTINCT(OBJECT_NAME)) FROM T; -- Com ndice BTREE


COUNT(DISTINCT(OBJECT_NAME))
-
40998
Decorrido: 00:00:08.95

SQL> SELECT COUNT(DISTINCT(OBJECT_NAME)) FROM T; Com ndice BITMAP


COUNT(DISTINCT(OBJECT_NAME))
-
40998
Decorrido: 00:00:03.15

130 130
Lab 6.4: Design de Aplicao
Abra uma sesso com o usurio SCOTT com SET TIMING ON:

Crie um ndice BTREE na coluna OWNER da tabela T:


SQL> CREATE INDEX IDX_T ON T(OWNER);

Execute este SQL:


SQL> SELECT COUNT(*) FROM T T_ALIAS WHERE OBJECT_NAME = 'T';

Com o usurio SYS, verifique o contedo da V$SESSION_EVENT da sesso


do SCOTT. Guarde o resultado.

Feche e abra a sesso com o SCOTT com SET TIMING ON

Execute este SQL:


SQL> SELECT /*+ INDEX(T_ALIAS,IDX_T) */ COUNT(*) FROM T T_ALIAS WHERE
OBJECT_NAME = 'T';

131 131
Estatsticas

132 132
Estatsticas e SQL Engine
Optimizer Statistics
Table statistics
Number of rows
Number of blocks
Average row length
Column statistics
Number of distinct values (NDV) in column
Number of nulls in column
Data distribution (histogram)
Extended statistics
Index statistics
Number of leaf blocks
Average data blocks per Key
Levels
Index clustering factor

System Statistics
I/O performance and utilization
CPU performance and utilization

133
Estatsticas - Tabela
DBA_TABLES / ALL_TABLES / USER_TABLES
SELECT TABLE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT,
AVG_ROW_LEN, SAMPLE_SIZE, LAST_ANALYZED FROM USER_TABLES ORDER BY 1;

134
Estatsticas - ndices
DBA_INDEXES / ALL_INDEXES / USER_INDEXES
SELECT TABLE_NAME, INDEX_NAME, NUM_ROWS, BLEVEL, LEAF_BLOCKS,
DISTINCT_KEYS, CLUSTERING_FACTOR, AVG_LEAF_BLOCKS_PER_KEY,
AVG_DATA_BLOCKS_PER_KEY, SAMPLE_SIZE, LAST_ANALYZED FROM USER_INDEXES
ORDER BY 1,2;

135
Estatsticas - Colunas
DBA_TAB_COLUMNS / ALL_TAB_COLUMNS / USER_TAB_COLUMNS
SELECT TABLE_NAME, COLUMN_NAME, NUM_DISTINCT, NUM_NULLS, DENSITY,
LOW_VALUE, HIGH_VALUE, DATA_LENGTH, AVG_COL_LEN, SAMPLE_SIZE,
LAST_ANALYZED FROM USER_TAB_COLUMNS ORDER BY 1,2;

136
OPTIMIZER_DYNAMIC_SAMPLING

137
OPTIMIZER_DYNAMIC_SAMPLING

138
Coleta de Estatsticas - ANALYZE
ANALYZE TABLE emp VALIDATE STRUCTURE;
ANALYZE TABLE emp VALIDATE STRUCTURE CASCADE;
ANALYZE TABLE emp VALIDATE STRUCTURE CASCADE FAST;
ANALYZE TABLE emp VALIDATE STRUCTURE CASCADE ONLINE;

UTLCHAIN.SQL / UTLCHN1.SQL
ANALYZE TABLE emp LIST CHAINED ROWS INTO CHAINED_ROWS;

139
Estatsticas: Coleta Automtica
Automatic Optimizer Statistics Collection
SQL> SELECT CLIENT_NAME, STATUS FROM DBA_AUTOTASK_CLIENT;

SQL> BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE (
CLIENT_NAME => 'AUTO OPTIMIZER STATS COLLECTION'
,OPERATION => NULL
,WINDOW_NAME => NULL
);
END;
/

SQL> BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE (
CLIENT_NAME => 'AUTO OPTIMIZER STATS COLLECTION'
,OPERATION => NULL
,WINDOW_NAME => NULL
);
END;
/

140
Estatsticas: Coleta Manual
Procedures para coleta
DBMS_STATS.GATHER_DATABASE_STATS
DBMS_STATS.GATHER_SCHEMA_STATS
DBMS_STATS.GATHER_TABLE_STATS
DBMS_STATS.GATHER_INDEX_STATS

141 141
Estatsticas: Opes de Coleta
ESTIMATE_PERCENT (Percentual ou DBMS_STATS.AUTO_SAMPLE_SIZE)
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10);
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE);

DEGREE (Quantidade ou DBMS_STATS.DEFAULT_DEGREE)


EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2);
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>DBMS_STATS.DEFAULT_DEGREE);

CASCADE (TRUE, FALSE, ou AUTO_CASCADE)


EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>TRUE);
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>AUTO_CASCADE);

142 142
Estatsticas: Opes de Coleta
OPTIONS (GATHER, GATHER_STALE, GATHER_EMPTY, GATHER_AUTO)
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>TRUE,
OPTIONS=>'GATHER_STALE');
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>AUTO_CASCADE
OPTIONS=>'GATHER_AUTO);

GRANULARITY (ALL, AUTO, DEFAULT, GLOBAL, GLOBAL AND PARTITION,


PARTITION, SUBPARTITION)
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>AUTO_CASCADE
OPTIONS=>'GATHER_AUTO, GRANULARITY=ALL);
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>AUTO_CASCADE
OPTIONS=>'GATHER_AUTO, GRANULARITY=AUTO);

143 143
Estatsticas: Opes de Coleta
NO_INVALIDATE (TRUE, FALSE, ou DBMS_STATS.AUTO_INVALIDATE)
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>AUTO_CASCADE
OPTIONS=>'GATHER_AUTO, GRANULARITY=AUTO, NO_INVALIDATE=TRUE);
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => 10, DEGREE=>2, CASCADE=>AUTO_CASCADE
OPTIONS=>'GATHER_AUTO, GRANULARITY=AUTO,
NO_INVALIDATE='DBMS_STATS.AUTO_INVALIDATE');

144 144
Estatsticas - 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;

145
Histogramas
- Buckets: mximo de 254 / 127 (2048 no 12c);
- Frequency Histograms;
- Height-Balanced Histograms;
- Top Frequency Histograms (12c);
- Hybrid Histograms (12c).

Problemas:
- Tabelas que no precisam de Histogramas;
- Custo de coleta;
- Sensibilidade a coleta por SAMPLE;
- Sensibilidade a momento da coleta (Novos pedidos s 22:00?);
- Bind Variables (pr ACS);
- Frequency: Se um valor no est em um Bucket, ser considerada metade da
cardinalidade do valor menos popular;
- Height-Balanced: Se um valor no popular (s est em 1 Bucket), ser considerada
a cardinalidade = nmero de linhas no populares / nmero de valor no populares
(11gR2).

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

146
Frequency Histograms
Utilizados se:
- Se o NDV menor ou igual que a quantidade de Buckets indicados na coleta;
- utilizado AUTO_SAMPLE_SIZE na execuo da coleta.

147
Height Balanced Histograms
Utilizados se:
- Se o nmero de Buckets indicados na coleta menor que o NDV.

148
Top Frequency Histograms (12c)
Utilizados se:
- Se o NDV maior que a quantidade de Buckets indicados na coleta;
- utilizado AUTO_SAMPLE_SIZE na execuo da coleta;
- Se o percentual de linhas ocupadas pelos Top Values igual ou maior que p, sendo
que p = (1-(1/Buckets))*100.

149
Hybrid Histograms (12c)
Utilizados se:
- Se o nmero de Buckets indicados na coleta menor que o NDV;
- utilizado AUTO_SAMPLE_SIZE na execuo da coleta;
- Se os crittios para Top Frequency Histograms no se aplicam.

150
Estatsticas: Opes de Coleta
METHOD_OPT
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 100
FOR ALL INDEXED COLUMNS SIZE AUTO
FOR ALL INDEXED COLUMNS SIZE REPEAT
FOR ALL INDEXED COLUMNS SIZE SKEWONLY
FOR COLUMNS C1 SIZE 100
FOR COLUMNS C1 SIZE AUTO
FOR COLUMNS C1 SIZE REPEAT

EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE,
METHOD_OPT=>'FOR ALL INDEXED COLUMNS SIZE AUTO');

151 151
Estatsticas: Opes de Coleta
Coleta geral
EXEC DBMS_STATS.GATHER_DATABASE_STATS
(ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE,
DEGREE=>2,
CASCADE=>AUTO_CASCADE
OPTIONS=>'GATHER_AUTO,
GRANULARITY=>AUTO,
NO_INVALIDATE=>'DBMS_STATS.AUTO_INVALIDATE');

Coleta por exceo


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

EXEC DBMS_STATS.GATHER_TABLE_STATS ('SCOTT', 'EMP', ESTIMATE_PERCENT=>100,


DEGREE=>1, CASCADE=>TRUE, OPTIONS=>'GATHER',
GRANULARITY=>'ALL',NO_INVALIDATE=>TRUE,METHOD_OPT=>'FOR ALL INDEXED
COLUMNS SIZE AUTO');

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

152 152
Outras Estatsticas
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;

153
System Statistics
Consulta
SQL> SELECT PNAME, PVAL1 FROM SYS.AUX_STATS$;

Remoo
SQL> EXEC DBMS_STATS.DELETE_SYSTEM_STATS;

Coleta NOWORKLOAD
SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS;

Coleta WORKLOAD
SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('START');
SQL> EXEC DBMS_STATS.GATHER_SYSTEM_STATS('STOP');

154
Extended Statistics Column Groups

155
Extended Statistics Column Groups
SQL> CONN SH/SH
SQL> SELECT DBMS_STATS.CREATE_EXTENDED_STATS(USER, 'CUSTOMERS')
FROM DUAL;

SQL> BEGIN
DBMS_STATS.GATHER_TABLE_STATS( 'SH','CUSTOMERS',
METHOD_OPT=>'FOR ALL COLUMNS SIZE SKEWONLY ' || 'FOR COLUMNS SIZE
SKEWONLY (CUST_STATE_PROVINCE,COUNTRY_ID)');
END;
/

SQL> SELECT SYS.DBMS_STATS.SHOW_EXTENDED_STATS_NAME('SH','CUSTOMERS',


'(CUST_STATE_PROVINCE,COUNTRY_ID)') COL_GROUP_NAME
FROM DUAL;

SQL> SELECT EXTENSION_NAME, EXTENSION FROM USER_STAT_EXTENSIONS


WHERE TABLE_NAME='CUSTOMERS';

156 156
Extended Statistics Expression

157
Extended Statistics Expression
SQL> CONN SH/SH
SQL> SELECT DBMS_STATS.CREATE_EXTENDED_STATS(USER, 'CUSTOMERS')
FROM DUAL;

SQL> BEGIN
DBMS_STATS.GATHER_TABLE_STATS('SH','CUSTOMERS'
,METHOD_OPT => 'FOR ALL COLUMNS SIZE SKEWONLY FOR COLUMNS
(LOWER(CUST_STATE_PROVINCE)) SIZE SKEWONLY');
END;
/

158 158
Estatsticas Pendentes

159
Estatsticas Pendentes
SQL> CONN SH/SH
SQL> EXEC DBMS_STATS.SET_TABLE_PREFS
('SH','CUSTOMERS','PUBLISH','FALSE');
SQL> SELECT * FROM USER_TAB_PENDING_STATS;
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SH','CUSTOMERS');
SQL> SELECT * FROM USER_TAB_PENDING_STATS;
SQL> EXEC DBMS_STATS.PUBLISH_PENDING_STATS('SH','CUSTOMERS');
SQL> SELECT * FROM USER_TAB_PENDING_STATS;

SQL> EXEC DBMS_STATS.SET_TABLE_PREFS ('SH','SALES','PUBLISH','FALSE');


SQL> SELECT * FROM USER_TAB_PENDING_STATS;
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SH','SALES');
SQL> SELECT * FROM USER_TAB_PENDING_STATS;
SQL> EXEC DBMS_STATS.DELETE_PENDING_STATS('SH','SALES');
SQL> SELECT * FROM USER_TAB_PENDING_STATS;

160
Restore de Estatsticas

161
Restore de Estatsticas
SQL> CONN OE/OE
SQL> COL TABLE_NAME FORMAT A10
SQL> SELECT
TABLE_NAME,
TO_CHAR(STATS_UPDATE_TIME,'YYYY-MM-DD:HH24:MI:SS') AS STATS_MOD_TIME
FROM DBA_TAB_STATS_HISTORY
WHERE TABLE_NAME='ORDERS'
AND OWNER='OE'
ORDER BY STATS_UPDATE_TIME DESC;
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('OE', 'ORDERS');

SQL> EXEC DBMS_STATS.RESTORE_TABLE_STATS( 'OE','ORDERS',


TO_TIMESTAMP('2015-01-28:15:00:00','YYYY-MM-DD:HH24:MI:SS') );

162
Transporte de Estatsticas

163
Transporte de Estatsticas
Origem
EXEC DBMS_STATS.CREATE_STAT_TABLE (ownname => 'HR', stattab => TESTE_STATS'));

EXEC DBMS_STATS.GATHER_SCHEMA_STATS ('HR');


BEGIN DBMS_STATS.EXPORT_SCHEMA_STATS (ownname => 'HR', stattab => 'TESTE_STATS'

$ expdp HR/HR DIRECTORY=dump_directory DUMPFILE=TESTE_STATS.dmp


TABLES=TESTE_STATS

Destino:
$ impdp PORTILHO DIRECTORY=dump_directory DUMPFILE=TESTE_STATS.dmp
TABLES=TESTE_STATS

SQL> EXEC DBMS_STATS.IMPORT_SCHEMA_STATS(ownname => 'HR', stattab =>


'TESTE_STATS');

164
DBMS_SQLTUNE

165 165
DBMS_SQLTUNE

166
DBMS_SQLTUNE

167
Lab 7.1: DBMS_SQLTUNE
Escolha um dos SQLs mais lentos na V$SQL e o analise com DBMS_SQLTUNE.

DECLARE RET_VAL VARCHAR2(4000);


BEGIN
RET_VAL := DBMS_SQLTUNE.CREATE_TUNING_TASK(SQL_ID => '12345678910', SCOPE =>
DBMS_SQLTUNE.SCOPE_COMPREHENSIVE, TIME_LIMIT => 60, TASK_NAME => 'Portilho Tuning Task',
DESCRIPTION => 'Portilho Tuning Task');
END;
/

BEGIN DBMS_SQLTUNE.EXECUTE_TUNING_TASK('Portilho Tuning Task'); END;


/

SET LONG 9000


SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('Portilho Tuning Task') RECOMMENTATION FROM
DUAL;
SELECT DBMS_SQLTUNE.SCRIPT_TUNING_TASK('Portilho Tuning Task') RECOMMENTATION FROM
DUAL;

BEGIN DBMS_SQLTUNE.DROP_TUNING_TASK('Portilho Tuning Task'); END;


/

168 168
Fragmentao

169 169
Fragmentao

Blocos logicamente contguos espalhados fisicamente.

Espao livre na TABLESPACE / DATAFILEs.

Espao livre da TABELA.

Espao livre no NDICE.

Row Chaining.

Migrated Rows.

EXTENTs.

170 170
Fragmentao: SHRINK

ALTER TABLESPACE ... COALESCE

ALTER TABLE ... ENABLE ROW MOVEMENT

ALTER TABLE ... SHRINK SPACE COMPACT

ALTER TABLE ... SHRINK SPACE

ALTER TABLE ... MOVE

171 171
Fragmentao: Row Chaining

Whats the Difference between Row Migration and Row Chaining?


https://antognini.ch/2016/10/whats-the-difference-between-row-migration-and-row-chaining/
172 172
Fragmentao: Row Migration

173 173
Fragmentao ndices - DELETEs
$ sqlplus SCOTT/TIGER
SQL> CREATE TABLE T1 AS SELECT * FROM ALL_OBJECTS;
SQL> INSERT INTO T1 SELECT * FROM T1;
SQL> INSERT INTO T1 SELECT * FROM T1;
SQL> INSERT INTO T1 SELECT * FROM T1;
SQL> INSERT INTO T1 SELECT * FROM T1;
SQL> COMMIT;
SQL> SELECT COUNT(*) FROM T1;
SQL> CREATE INDEX T1_IDX1 ON T1(OBJECT_TYPE);

SQL> SELECT LF_ROWS, DEL_LF_ROWS FROM INDEX_STATS WHERE NAME = 'T1_IDX1';


SQL> ANALYZE INDEX T1_IDX1 VALIDATE STRUCTURE;
SQL> SELECT LF_ROWS, DEL_LF_ROWS FROM INDEX_STATS WHERE NAME = 'T1_IDX1';
SQL> DELETE FROM T1 WHERE OBJECT_TYPE = 'SYNONYM';
SQL> COMMIT;
SQL> SELECT LF_ROWS, DEL_LF_ROWS FROM INDEX_STATS WHERE NAME = 'T1_IDX1';
SQL> ANALYZE INDEX T1_IDX1 VALIDATE STRUCTURE;
SQL> SELECT LF_ROWS, DEL_LF_ROWS FROM INDEX_STATS WHERE NAME = 'T1_IDX1';
SQL> SELECT NAME FROM INDEX_STATS WHERE ((DEL_LF_ROWS/LF_ROWS)*100) > 50;

SQL> SET AUTOTRACE ON STATISTICS


SQL> SELECT COUNT(OBJECT_TYPE) FROM T1;
SQL> ALTER INDEX T1_IDX1 REBUILD;
SQL> SELECT COUNT(OBJECT_TYPE) FROM T1;

174 174
Fragmentao ndices - UPDATEs
$ sqlplus SCOTT/TIGER
SQL> SET AUTOTRACE OFF
SQL> @IndexesToRebuild-UPDATEs.sql
SQL> UPDATE T1 SET OBJECT_TYPE = 'NO';
SQL> COMMIT;
SQL> @IndexesToRebuild-UPDATEs.sql
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'T1');
SQL> @IndexesToRebuild-UPDATEs.sql
SQL> ALTER INDEX T1_IDX1 REBUILD;
SQL> @IndexesToRebuild-UPDATEs.sql

175 175
Lab 8.1: DBMS_ADVANCED_REWRITE
Abra uma sesso com o usurio SCOTT com SET TIMING ON:

Execute este SQL e anote seu tempo de execuo:


SQL> SELECT /*+ INDEX(T_ALIAS,IDX_T) */ COUNT(*) FROM T T_ALIAS WHERE
OBJECT_NAME = 'T';

Execute este SQL e anote seu tempo de execuo:


SQL> SELECT COUNT(*) FROM T T_ALIAS WHERE OBJECT_NAME = 'T';

Com o usurio SYS, d as permisses necessrias para que o usurio


SCOTT utilize o DBMS_ADVANCED_REWRITE:
$ sqlplus / AS SYSDBA
SQL> GRANT EXECUTE ON DBMS_ADVANCED_REWRITE TO SCOTT;
SQL> GRANT CREATE MATERIALIZED VIEW TO SCOTT;

176 176
Lab 8.2: DBMS_ADVANCED_REWRITE
Na sesso do usurio SCOTT, execute o DBMS_ADVANCE_REWRITE:
BEGIN
SYS.DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE (
NAME => 'PORTILHO_REWRITE',
SOURCE_STMT => 'SELECT /*+ INDEX(T_ALIAS,IDX_T) */ COUNT(*) FROM T T_ALIAS WHERE
OBJECT_NAME = ''T''',
DESTINATION_STMT => 'SELECT COUNT(OBJECT_NAME) FROM T T_ALIAS WHERE
OBJECT_NAME = ''T''',
VALIDATE => FALSE,
REWRITE_MODE => 'TEXT_MATCH');
END;
/

Execute novamente este SELECT e verifique seu tempo de execuo:


SQL> SELECT /*+ INDEX(T_ALIAS,IDX_T) */ COUNT(*) FROM T T_ALIAS WHERE OBJECT_NAME = 'T';

Remova o REWRITE, execute novamente o SELECT e verifique seu tempo de


execuo:
SQL> EXEC SYS.DBMS_ADVANCED_REWRITE.DROP_REWRITE_EQUIVALENCE (NAME =>
'PORTILHO_REWRITE');
SQL> SELECT /*+ INDEX(T_ALIAS,IDX_T) */ COUNT(*) FROM T T_ALIAS WHERE OBJECT_NAME = 'T';

177 177
Resource Plan

178 178
Instance Caging

11.2.0.1: CPU_COUNT

12.1.0.1: PROCESSOR_GROUP_NAME

179 179
Resource Plan
Separao de Recursos por:

ORACLE_USER

SERVICE_NAME

CLIENT_OS_USER

CLIENT_PROGRAM

CLIENT_MACHINE

MODULE_NAME

MODULE_NAME_ACTION

SERVICE_MODULE

SERVICE_MODULE_ACTION

Controle dos Recursos:

CPU

Sesses Ativas

Paralelismo

I/O (>= 11gR1)

180 180
Resource Plan

181 181
Resource Plan
Mudanas de planos:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'PEAKTIME';
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'OFF-PEAK';

Monitorao:

DBA_RSRC_CONSUMER_GROUP_PRIVS

DBA_RSRC_PLANS

V$SESSION

V$RSRC_PLAN

V$RSRC_CONSUMER_GROUP

V$RSRC_SESSION_INFO

V$RSRC_PLAN_HISTORY

V$RSRC_CONS_GROUP_HISTORY

V$RSRCMGRMETRIC

V$RSRCMGRMETRIC_HISTORY

182 182
Lab 9.1 Resource Plan
Analise o cdigo do arquivo ResourcePlan.sql.

Altere o arquivo para suprir as necessidades de trs tipos de uso do banco


de dados:

Usurio SOE: OLTP, deve ter muita prioridade durante o dia, e pouca durante a noite.

Usuario HR: BI, deve ter pouca prioridade durante o dia e muita durante a noite.

Usurio SCOTT: AD-HOC, s pode utilizar CPU que nenhum dos usurios acima estiver
utilizando.

Outros: OTHERS_GROUP, s podem utilizar CPU que nenhum dos usurios acima
estiver utilizando.

183
183
Relatrio AWR

184 184
Lab 10.1: AWR
Tire um SNAPSHOT avulso.
$ sqlplus / AS SYSDBA
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;

Execute a carga no sistema.


$ unzip -q swingbench261040.zip
$ cd swingbench/bin
$ ./charbench -uc 10 -cs //localhost/PROD -c ../configs/SOE_Server_Side_V2.xml

Tire outro SNAPSHOT avulso.


$ sqlplus / AS SYSDBA
SQL> EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;

Tire um relatrio AWR comparando os dois SNAPSHOTs.


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

Analise o relatrio AWR.

185 185
Reviso

186 186
Mtodo de Tuning

O Banco de Dados est lento agora:



Encontrar indcios do gargalo na V$SYSTEM_EVENT.

Encontrar indcios do gargalo na V$SESSION_WAIT.

Encontrar o(s) SID(s) ofensor na V$SESSION_WAIT.

Encontrar o maior Wait Event deste(s) SID(s) na V$SESSION_EVENT.

Corrigir o maior Wait Event possvel.

Se o tempo esta satisfatrio, finalizar o processo.

O Banco de Dados estava lento ontem:



Encontrar indcios do gargalo na V$SYSTEM_EVENT (histrico).

Encontrar o maior Wait Event via Statspack / AWR.

Corrigir o maior Wait Event possvel.

Se o tempo esta satisfatrio, finalizar o processo.

Este SQL est lento:



Executar o comando SQL com Extended SQL Trace.

Encontrar indcios do gargalo durante a execuo do SQL Trace.

Encontrar o maior Wait Event via tkprof.

Corrigir o maior Wait Event possvel.

Se o tempo esta satisfatrio, finalizar o processo.

187 187
Perguntas?

Ricardo Portilho Proni


[email protected]
Nerv Informtica 188

You might also like