Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
3
3
Isenção de responsabilidade
● Nãi acredite em tudi i que lê. Questine tudi.
● Pir algi estar escriti, nãi significa que é verdade.
● O que é verdade aqui, pide nãi ser verdade lá.
● O que era verdade intem, pide nãi ser verdade hije.
● O que é verdade hije, pide nãi ser verdade amanhã.
● Se is fatis nãi se adequam à teiria, midifique a teiria.
● Questine, e só acredite em fatis: teste.
● Também tente privar que vicê está erradi.
● Implemente a siluçãi ni menir escipi pissível.
● Quandi vicê mudar algi, pide acintecer uma de três ciisas.
Tendemos a encontrar soluções fáceis
http://www.tylervigen.com/spurious-correlations
Correlação != Causalidade
http://www.tylervigen.com/spurious-correlations
Comandos no Treinamento
Comando com o usuário root:
# ls -lh
Comando no Oracle:
SQL> SELECT STATUS FROM V$INSTANCE;
8
glogin.sql
$ cat $ORACLE_HOME/sqlplus/admin/glogin.sql
…
SET PAGESIZE 1000
SET LINESIZE 220
SET TIMING ON
SET TIME ON
SET SQLPROMPT '&_user@&_connect_identifier> '
DEFINE _EDITOR=vi
…
1
----------
1
Elapsed: 00:00:00.00
09:09:00 SYS@ORCL>
9
Logs
Oracle (11gR2, 12cR1, 12cR2)
$ tail -f $ORACLE_BASE/diag/rdbms/<database>/<SID>/trace/alert_<SID>.log
10
CDB Architecture
11
Deprecaton of Non-CDB Arclitecture
Documentação 12cR1:
Documentação 12cR2:
12cR2 CDB New Features
✔ Subset Standby
✔ Data Guard Briker PDB Migratin ir Failiver
✔ Criss-Platirm Impirt if a Pluggable Database inti a Multtenant Cintainer Database
✔ I/O Rate Limits fir PDBs
✔ Heat Map and Autimatc Data Optmizatin Suppirt fir CDBs
✔ PDB Character Set
✔ PDB Refresh
✔ Hints in CONTAINERS Query
✔ Parallel PDB Creatin Clause
✔ PDB Archive Files (.pdb Files)
✔ Default Tablespace Clause
✔ Clining a PDB
✔ Near Zeri Diwntme PDB Relicatin
✔ Ligical Standby Database ti Suppirt CDBs with PDBs with Diferent Character Sets
✔ LigMiner ti Suppirt CDBs with PDBs with Diferent Character Sets
✔ Suppirt fir PDBs with Diferent Character Sets, Time Zine File Versiins, and Database Time
Zines in a CDB
✔ Memiry Resiurce Management
✔ Per-Pricess PGA Limits
✔ Perfirmance Prifiles and Mandatiry PDB Prifiles
✔ CDB-Level PDB Lickdiwn
12cR2 CDB New Features
✔ Applicatin Riit
✔ Prixy PDB
✔ Firwarding Cinnectins ti A New Address Based in Service
✔ Service-Level ACLs fir TCP Priticil
✔ Flashback Pluggable Database
✔ Upgrading a CDB With One ir Mire PDBs in a Single Operatin
✔ Suppirt fir Thiusands if Pluggable Databases fir Each Multtenant Cintainer Database
✔ Pluggable Database Lickdiwn Prifiles Enhancements
✔ Pluggable Database Operatng System Credentals
✔ Oracle Enterprise Manager Database Express (EM Express) Resiurce Manager Suppirt
✔ EM Express: Simplifying Cinfiguratin fir Multtenant Thriugh Single Pirt Access
✔ EM Express: Perfirmance Hub Enhancements
✔ Autimatc Wirkliad Repisitiry (AWR) Suppirt fir a Pluggable Database (PDB)
✔ Selectve PDB Upgrades
✔ AWR_PDB_AUTOFLUSH_ENABLED Initalizatin Parameter
✔ ENABLE_AUTOMATIC_MAINTENANCE_PDB Initalizatin Parameter
✔ AUTOTASK_MAX_ACTIVE_PDBS Initalizatin Parameter
✔ Glibal and Shared Cinnectin Piil fir Oracle Cliud and Multtenant Oracle Databases
✔ Priiritzed Rebalancing
✔ Oracle Database Vault Cimmin Realms and Cimmand Rules fir Oracle Multtenant
Opton Multtenant
Multtenant - EE
Singletenant - SE2
Esse banco utliza CDB Arquitecture?
Que Containers / PDBs este banco tem?
Em que Container estou conectado?
Como conectar em um PDB? SET CONTAINER
Como conectar em um PDB?
$ lsnrctl status
...
Services Summary...
Service "5397376af7702ac5e0536a00a8c0505d" has 1 instance(s).
Instance "ORCL", status READY, has 1 handler(s) for this service...
Service "ORCL" has 1 instance(s).
Instance "ORCL", status READY, has 1 handler(s) for this service...
Service "ORCLXDB" has 1 instance(s).
Instance "ORCL", status READY, has 1 handler(s) for this service...
Service "prod" has 1 instance(s).
Instance "ORCL", status READY, has 1 handler(s) for this service...
The command completed successfully
$
Como conectar em um PDB? tnsnames.ora
$ cat $ORACLE_HOME/network/admin/tnsnames.ora
...
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = nerv06.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
PROD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = nerv06.localdomain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PROD)
)
)
...
$
Como conectar em um PDB? tnsnames.ora
Como conectar em um PDB? Easy Connect
E agora, qual o nome da Instância? E do Banco?
E agora, qual o nome da Instância? E do Banco?
CDB e PDBs: STARTUP
CDB e PDBs: STARTUP
Alert Log
DATAFILEs
DATAFILEs
DATAFILEs
Dicionário de Dados
VIEWs
VIEWs
Parâmetros
Parâmetros
TABLESPACEs
USERs
USERs
USERs
USERs
SELECT em outros Containers
Criando (Clonando) um PDB
Criando (Clonando) um PDB
Criando (Clonando) um PDB
Criando (Clonando) um PDB
Criando (Clonando) um PDB
Unplug / Plug
Unplug / Plug
DROP
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;
“Dicas” de SQL Tuning?
55
55
Lendas de SQL
●
O Custi nãi quer dizer nada?
●
Índice BITMAP em baixa “cardinalidade”?
●
Sintaxe Oracle iu ANSI?
●
SELECT(1) iu SELECT COUNT(*)?
●
Ordem da cláusula WHERE?
●
Ordem de JOIN?
●
CHAR é mais rápidi di que VARCHAR2?
●
Tabelas pequenas nãi utlizam índice?
●
Cláusulas de negaçãi nãi utlizam índice?
●
Busca pir NULL nãi utliza índice?
●
Evite Subqueries?
●
Evite VIEWs?
●
Evite EXISTS?
●
Evite Listas IN?
●
NESTED LOOPs é ruim?
●
< > é melhir que BETWEEN?
56
Lab 1 – Lendas de SQL
Hands On !
57
Lab 1.1: Lendas de SQL - COUNT(*)
Execute logon com o usuário SCOTT, e verifque qual é seu arquivo de TRACE:
$ sqlplus SCOTT/TIGER
SQL> COLUMN TRACEFILE FORMAT A100
SQL> SELECT P.TRACEFILE FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR AND S.USERNAME = 'SCOTT';
59
Cost Based Optmizer
60
Database SQL Tuning Guide
62
62
Oracle Optmizer Blog
Cost Based Optmizer
“Exite. um.d te.oraid e. que. de. dlguém. e.dcsob.raira o que. o CBO fdz e. csom.o e.le. funcsiond, e.le. iraá
e.ddtpdrae.cse.ra indtdntdne.dm.e.nte. e. de.raá dub.dttuí o tpora dlgo din d m.did b.izdrarao e. ine.xtplicsáve.l.
Exidte. outrad te.oraid e. que. idto já dcsonte.cse.u... udd ve.ze.d.”
64
64
CBO - Cost Based Optmizer – O que é o custo?
Cist = (
#SRds * sreadtm +
#MRds * mreadtm +
#CPUCycles / cpuspeed
) / sreadtm
OU
Custi = (
Quantdade de leituras de um únici blici * Tempi de leitura de um únici blici +
Quantdade de leituras de múltplis blicis * Tempi de leitura de múltplis blicis +
Ciclis de CPU / Velicidade da CPU
) / Tempi de leitura de um únici blici
66
O que é o Custo?
67
Seletvidade e Cardinalidade
Seletvidade
É um valir entre 0 e 1 (iu um percentual) que representa a fraçãi de linhas ibtdas pir uma
iperaçãi.
Cardinalidade
É i númeri de linhas retirnadas pir uma iperaçãi.
Exemplo:
SQL> SELECT MODELS FROM CARS;
120 rows selected.
Cardinalidade = 120.
Seletvidade = 1.00 (120/120).
●
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 (0 a 100, padrãi 0)
●
OPTIMIZER_INDEX_COST_ADJ (1 a 10000, padrãi 100)
●
Histigrams
●
Extended Statstcs 69
Confguração 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 Statstcs 70
Confguração 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 Statstcs 71
Ferramentas Básicas
72
AUTOTRACE
SQL> SET AUTOTRACE ON;
SQL> SELECT ENAME FROM EMP;
ENAME
----------
SMITH
...
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 84 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
...
0 sorts (disk)
14 rows processed
73
AUTOTRACE
SQL> SET AUTOTRACE TRACEONLY;
SQL> SELECT ENAME FROM EMP;
14 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 84 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
...
0 sorts (disk)
14 rows processed
74
AUTOTRACE
SQL> SET AUTOTRACE TRACEONLY EXPLAIN;
SQL> SELECT ENAME FROM EMP;
Execution Plan
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 84 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 84 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
SQL>
75
AUTOTRACE
SQL> SET AUTOTRACE TRACEONLY STATISTICS;
SQL> SELECT ENAME FROM EMP;
14 rows selected.
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
8 consistent gets
0 physical reads
0 redo size
731 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
SQL>
76
SQL Developer: Plano de Execução
77
SQL Developer: Plano de Execução
78
SQL Trace (Event 10046): Níveis
0 - Trace OFF
2 - Regular SQL Trace
4 - Nível 2, + Bind Variable
8 - Nível 2 + Wait Events
12 - Nível 2, + Bind Variable + Wait Events
79
SQL Trace (Event 10046): Atvação
Todas versões:
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
SQL> ALTER SESSION SET 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';
80
SQL Trace (Event 10046): Atvação
Versões >= 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;
81
SQL Trace (Event 10046): Atvação
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;
/
82
SQL Trace (Event 10046): Atvação
Todas versões:
SQL> EXEC DBMS_SUPPORT.START_TRACE(WAITS=>TRUE, BINDS=>FALSE);
SQL> EXEC DBMS_SUPPORT.STOP_TRACE;
83
SQL Trace (Event 10046): Atvação
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
OU
84
SQL Trace (Event 10053)
SQL> ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT FOREVER, LEVEL 1';
SQL> ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT OFF';
OU
85
Lab 2 – SQL Trace
Hands On !
86
Lab 2.1: SQL Trace (Event 10046)
SQL> CONN SCOTT/TIGER
SQL> SELECT P.SPID, P.TRACEFILE
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR AND S.USERNAME = 'SCOTT';
SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7369;
SQL> SELECT * FROM EMP;
SQL> CREATE TABLE T21 AS SELECT * FROM ALL_OBJECTS;
87
Lab 2.2: tkprof (Event 10046)
88
Lab 2.3: SQL Trace (Event 10046)
89
Lab 2.4: SQL Trace (Event 10053)
SQL> CONN SCOTT/TIGER
SQL> SELECT P.SPID, P.TRACEFILE
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR AND S.USERNAME = 'SCOTT';
SQL> ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT FOREVER, LEVEL 1';
SQL> SELECT EMPNO, ENAME, DNAME, LOC
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
90
Lab 2.5: SQL Trace (Event 10053)
91
Lab 2.6: SQL Trace (Event 10053)
92
Lab 2.7: SQL Trace (Event 10053)
93
Lab 2.8: SQL Trace (Event 10053)
94
Lab 2.9: SQL Trace (Event 10053)
95
Lab 2.10: SQL Trace (Event 10053)
96
Lab 2.11: SQL Trace (Event 10053)
97
Lab 2.12: SQL Trace (Event 10053)
98
Lab 2.13: SQL Trace (Event 10053)
99
Lab 2.14: SQL Trace (Event 10053)
100
Lab 2.15: SQL Trace (Event 10053)
101
SQL Engine
102
Terminologia
●
Sif Parse / Hard Parse
●
LIO (Ligical Input/Output)
●
PIO (Physical Input/Output)
●
Latch / Mutex
●
Bufer Cache
●
Shared Piil
●
Library Cache
103
PGA
104
SELECT
5: SELECT (COLUMN / DISTINCT COLUMN / expressiin / scalar subquery)
1: FROM / FROM JOIN ON (fintes: TABLE, VIEW, MVIEW, PARTITION, SUBQUERY...)
2: * WHERE (cindições: TRUE, FALSE, UNKNOWN)
3: * GROUP BY (ipções: ROLLUP / CUBE)
4: * HAVING (cindiçãi: TRUE)
6: * ORDER BY (COLUMN)
Exemplo:
SELECT C.CUSTOMER_ID, COUNT(O.ORDER_ID) AS ORDER_CT
FROM OE.CUSTOMERS C
JOIN OE.ORDERS O ON C.CUSTOMER_ID = O.CUSTOMER_ID
WHERE C.GENDER = 'F'
GROUP BY C.CUSTOMER_ID
HAVING COUNT(O.ORDER_ID) > 4
ORDER BY ORDERS_CT, C_CUSTOMER_ID;
105
Processamento de SQL
●
OPEN CURSOR
●
PARSE
●
BIND
●
EXEC
●
FETCH (ARRAYSIZE, DEFAULT_SDU_SIZE (512 a 32767), RECV_BUF_SIZE, SEND_BUF_SIZE (sqlnet.ira)
●
CLOSE CURSOR
106
Processamento de SQL
107
Parse Time
108
PL/SQL Engine
109
SQL Recursivos
110
SQL Recursivos
111
Hard Parse / Sof Parse
112
Hard Parse / Sof Parse
113
Hard Parse
SQL> SELECT /* Quero achar este SQL */ COUNT(*) FROM T1;
SQL> SELECT /* Quero achar este SQL também */ COUNT(*) FROM T1;
SQL> SELECT /* Quero achar este SQL */ COUNT(*) FROM T1;
SQL> select /* Quero achar este SQL */ count(*) from t1;
SQL> SELECT /* Quero achar este SQL também */ COUNT(*) FROM T1;
SQL> SELECT SQL_ID, SQL_TEXT FROM V$SQL WHERE SQL_TEXT LIKE '%Quero achar este SQL%';
114
Lab 3 – SQL Engine
Hands On !
115
Lab 3.1: FETCH
Execute os comandos abaixo.
SQL> CONN HR/HR
SQL> SET AUTOTRACE TRACEONLY STATISTICS
SQL> SELECT * FROM EMPLOYEES;
116
Lab 3.2: FETCH
Execute os mesmo SELECT anterior, mas com o ARRAYSIZE diferente.
SQL> SET ARRAYSIZE 100
SQL> SELECT * FROM EMPLOYEES;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
9 consistent gets
0 physical reads
0 redo size
9335 bytes sent via SQL*Net to client
563 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
107 rows processed
117
Lab 3.3: Slared Pool
Reinicie a instância, e execute os comandos abaixo.
SQL> CONN / AS SYSDBA
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
SQL> CONN SCOTT/TIGER
118
Lab 3.4: Slared Pool
Execute novamente o mesmo SELECT.
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7369;
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
550 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
119
Lab 3.5: Slared Pool
Execute o mesmo SQL, duas vezes, mas solicitando outro registro.
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7499;
36 recursive calls
0 db block gets
53 consistent gets
0 physical reads
0 redo size
550 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
5 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7499;
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
550 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
120
Lab 3.6: Slared Pool
Execute o mesmo SQL, também duas vezes, mas solicitando outro registro.
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7521;
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
549 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7521;
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
549 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
121
Lab 3.7: Slared Pool
Execute o seguinte SQL, também duas vezes.
SQL> SELECT ENAME FROM EMP WHERE EMPNO IN (7654, 7698, 7782);
5 recursive calls
0 db block gets
13 consistent gets
2 physical reads
0 redo size
619 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> SELECT ENAME FROM EMP WHERE EMPNO IN (7654, 7698, 7782);
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
619 bytes sent via SQL*Net to client
551 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
3 rows processed
122
Lab 3.8: Slared Pool
Remova as estatstcas da tabela, e execute o primeiro SQL, também duas vezes.
SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS('SCOTT', 'EMP');
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7369;
0 recursive calls
0 db block gets
2 consistent gets
16 physical reads
0 redo size
...
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> SELECT ENAME FROM EMP WHERE EMPNO = 7369;
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
...
0 sorts (memory)
0 sorts (disk)
1 rows processed
123
Lab 3.9: Slared Pool
Execute o SQL abaixo, que retorna mais dados, também duas vezes.
SQL> SELECT * FROM DEPT;
40 recursive calls
0 db block gets
88 consistent gets
41 physical reads
0 redo size
...
6 sorts (memory)
0 sorts (disk)
4 rows processed
124
Lab 3.10: Slared Pool
Limpe a Slared Pool, e execute novamente o SQL, também duas vezes.
SQL> CONN / AS SYSDBA
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
126
Lab 3.12: Hard Parse / Sof Parse
Execute novamente o SELECT na DEPT, verifcado os Parses.
SQL> SET AUTOTRACE OFF
SQL> SELECT S.NAME, M.VALUE FROM V$STATNAME S, V$MYSTAT M WHERE S.STATISTIC# =
M.STATISTIC# AND S.NAME IN ('parse count (total)', 'parse count (hard)');
parse count (total) 30
parse count (hard) 6
127
Lab 3.13: Bufer Cacle
Limpe o Bufer Cacle, e execute novamente o SQL da DEPT, também duas vezes.
SQL> CONN / AS SYSDBA
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;
2a execução:
0 recursive calls
0 db block gets
8 consistent gets
0 physical reads
0 redo size
...
0 sorts (memory)
0 sorts (disk)
4 rows processed 128
Lab 3.14: Connect / Parse / Commit
Crie a tabela abaixo com o usuário SCOTT.
SQL> CREATE TABLE T314 (C1 NUMBER);
129
Lab 3.15: PL/SQL Engine
Crie esta tabela com o usuário SCOTT:
SQL> CREATE TABLE T315 (C1 NUMBER);
130
Access Patls
131
Access Patls
• Full Table Scan (FTS)
• Table Access by ROWID
• Index Unique Scan
• Index Range Scan
• Index Range Scan descending
• Index Skip Scan
• Full Index Scan (FIS)
• Fast Full Index Scan (FFIS)
132
Full Table Scan
Depende de:
• Percentual de dadis que serãi acessadis;
• Quantdade de blicis lidis em leituras múltplas (db_file_multblick_read_ciunt);
• Velicidade de leitura de múltplis blicis x únici blici (System Statstcs);
• Distribuiçãi das linhas nis blicis;
• HWM.
133
Lab 4.1: FTS e Clustering Factor
Crie as duas tabelas abaixo com o usuário SCOTT, e compare as duas.
SQL> CONN SCOTT/TIGER
135
Lab 4.3: FTS e Clustering Factor
Compare as estatstcas das duas tabelas.
SQL> SET AUTOTRACE OFF
SQL> COL TABLE_NAME FORMAT A20
SQL> COL INDEX_NAME FORMAT A20
SQL> SELECT
T.TABLE_NAME,
I.INDEX_NAME,
I.CLUSTERING_FACTOR,
T.BLOCKS,
T.NUM_ROWS
FROM DBA_TABLES T, DBA_INDEXES I
WHERE T.TABLE_NAME = I.TABLE_NAME AND
T.TABLE_NAME IN ('T1', 'T2') AND
T.OWNER = 'SCOTT'
ORDER BY T.TABLE_NAME, I.INDEX_NAME;
136
Lab 4.4: FTS e HWM
Compare as estatstcas deste SELECT, antes e depois do DELETE.
SQL> CREATE TABLE T4 AS SELECT * FROM ALL_OBJECTS;
SQL> SET AUTOTRACE TRACEONLY
SQL> SELECT COUNT(*) FROM T4;
SQL> SELECT COUNT(*) FROM T4;
SQL> SELECT COUNT(*) FROM T4;
137
Lab 4.5: FTS e HWM
Verifque os blocos utlizados pela tabela, antes e depois do DELETE.
SQL> SET AUTOTRACE OFF
SQL> DROP TABLE T4;
SQL> ROLLBACK;
SQL> SELECT MIN(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) MIN_BLK,
MAX(DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) MAX_BLK FROM T4;
138
Index Scan
• Index Unique Scan
• Index Range Scan
• Index Skip Scan
• Index Full Scan (Pora que. le.ra to od b.locsod e. um. ín icse. E od d tdb.e.ld, e. não dó od d tdb.e.ld?)
• Index Fast Full Scan
139
Index Scan
• B-tree = Árvire Balanceada
• Riit Blick / Branch Blicks / Leaf Blicks
• Height / BEVEL (quandi i Height / BLEVEL aumenta?)
• Average Leaf Blicks per Key / Average Data Blicks per Key
• Clustering Factir
140
Lab 5.1: Index Scan
Compare as estatstcas destes SELECTs.
SQL> SET AUTOTRACE TRACEONLY STATISTICS
SQL> SELECT NAME FROM T1 WHERE ID = 0 AND NAME = 1;
0 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size
636 bytes sent via SQL*Net to client
552 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
142
Lab 5.3: Index Scan
Compare as estatstcas deste SELECTs.
SQL> SELECT NAME FROM T1 WHERE ID = 1;
1 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
11484 bytes sent via SQL*Net to client
552 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
100 rows processed
143
Index Unique Scan
144
Index Unique Scan
• Utlizadi cim Primary Key iu Unique Key;
• Cinsistent Gets mínimi = (Riws x 2) + BLEVEL + 1.
145
Index Range Scan
146
Index Range Scan
• Utlizadi cim Primary Key, Unique Key, iu Nin-unique Key;
• Cinsistent Gets mínimi = (Riws x 2) + BLEVEL + 1.
147
Index Range Scan - Sort
148
Index Full Scan
149
Index Full Scan
Utlizado quando:
• Não lá predicado, mas uma das colunas está indexada;
• Predicadi nãi é a primeira ciluna de um índice;
• Um índice pide ecinimizar um SORT.
150
Index Full Scan
• Sem predicadi, mas uma das cilunas está indexada;
• Predicado não é a primeira coluna de um índice;
• Um índice pide ecinimizar um SORT.
151
Index Full Scan
• Sem predicadi, mas uma das cilunas está indexada;
• Predicadi nãi é a primeira ciluna de um índice;
• Um índice pode economizar um SORT.
152
Index Full Scan
• Sem predicadi, mas uma das cilunas está indexada;
• Predicadi nãi é a primeira ciluna de um índice;
• Um índice pode economizar um SORT.
153
Index Full Scan
154
Index Full Scan
155
Index Skip Scan
• O predicadi cintém uma cindiçãi em uma ciluna indexada, mas esta ciluna nãi é a
primeira di índice, e as primeiras cilunas tem um baixi NDV.
156
Index Fast Full Scan
●
Utlizado quando todas as colunas do SELECT estão incluídas no índice;
●
Utliza MBRC;
●
Nãi há acessi à tabela;
●
Nãi pide ser utlizadi para evitar um SORT;
●
Peli menis uma das cilunas di índice deve ser NOT NULL.
157
Modelagem
158
PK: Natural ou Artfcial?
Natural (RG, CPF, Nita Fiscal, Matrícula, Apólice...)
• Naturalidade ni entendimenti das cilunas;
• Reduçãi da largura da linha;
• Menir quantdade de JOINs para exibir i resultadi final;
• Validaçãi natural de regras de negócii.
159
Lab 6.1: Data Types
Verifque os planos de execução dos SQL abaixo.
SQL> CONN SCOTT/TIGER
160
Lab 6.2: Data Types
Verifque o plano de execução do SQL abaixo.
SQL> CONN SCOTT/TIGER
SQL> CREATE TABLE T62 AS
WITH GENERATOR AS (
SELECT --+ materialize
ROWNUM ID FROM ALL_OBJECTS WHERE ROWNUM <= 2000)
SELECT
DECODE(
MOD(ROWNUM - 1,1000),
0, TO_DATE('31-Dec-4000'),
TO_DATE('01-Jan-2008') + trunc((rownum - 1)/100)
) DATA_PEDIDO
FROM GENERATOR V1, GENERATOR V2
WHERE ROWNUM <= 1827 * 100;
161
Lab 6.3: Data Types
Verifque o plano de execução do SQL abaixo.
SQL> CONN SCOTT/TIGER
SQL> CREATE TABLE T63 AS
SELECT
DATA_DATE,
TO_NUMBER(TO_CHAR(DATA_DATE,'yyyymmdd')) DATA_NUMBER,
TO_CHAR(DATA_DATE,'yyyymmdd') DATA_CHAR
FROM (SELECT TO_DATE('31-Dec-2007') + ROWNUM DATA_DATE FROM ALL_OBJECTS
WHERE ROWNUM <= 1827);
162
Query Transformaton
163
Query Rewrite
De acordo com a Documentação:
●
OR Expansiin
●
View Merging
●
Predicate Pushing
●
Subquery Unnestng
●
In-Memiry Aggregatin
●
Table Expansiin
●
Jiin Factirizatin
●
Query Rewrite with Materialized Views
●
Star Transfirmatin
164
Query Rewrite
●
Cintrile: Hints QUERY_TRANSFORMATION / NO_QUERY_TRANSFORMATION
165
View Merging
Controle: MERGE / NO_MERGE / Parâmetri _cimplex_view_merging (TRUE de 9i em diante).
Fom.od trae.ind od tpdrad e.nte.n e.ra que. e.dtdd udd e.xtprae.ddõe.d rae.torandm. rae.dultd od ife.rae.nte.d:
●
6 + 4 // 2 = 8
●
(6 + 4) // 2 = 5
166
Lab 7.1: View Merging
Execute o SELECT abaixo, e encontre no arquivo trace o View Merging.
SQL> CONN OE/OE
SQL> ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT FOREVER, LEVEL 1';
SQL> SELECT * FROM ORDERS O, (SELECT SALES_REP_ID FROM ORDERS) O_VIEW
WHERE O.SALES_REP_ID = O_VIEW.SALES_REP_ID (+)
AND O.ORDER_TOTAL > 100000;
167
Subquery Unnestng
- Cintrile: HINT NO_UNNEST, unnest_subquery (TRUE de 9i em diante).
- Similar a View Merging, icirre quandi a Subquery está licalizada na cláusula WHERE;
- A transfirmaçãi mais cimum é em um JOIN;
168
Subquery Unnestng + JE
170
Lab 7.3: Subquery Unnestng
Execute o SELECT abaixo, e encontre no arquivo trace o Subquery Unnestng.
SQL> CONN HR/HR
SQL> ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT FOREVER, LEVEL 1';
SQL> SELECT
OUTER.EMPLOYEE_ID,
OUTER.LAST_NAME,
OUTER.SALARY,
OUTER.DEPARTMENT_ID
FROM EMPLOYEES OUTER
WHERE OUTER.SALARY >
(SELECT AVG(INNER.SALARY)
FROM EMPLOYEES INNER
WHERE INNER.DEPARTMENT_ID = OUTER.DEPARTMENT_ID);
171
Lab 7.4: Subquery Unnestng
172
Predicate Pusling
- Cintrile: Hints PUSH_PRED / NO_PUSH_PRED;
- Geralmente utlizadi para aplicar is predicadis de um Query Blick em iutri Query Blick,
quandi nãi pide icirrer uma transfirmaçãi de Merging, para permitr a utlizaçãi de um índice
e filtrar mais cedi ni plani de execuçãi.
173
Lab 7.5: Predicate Pusling
Execute o SELECT abaixo, e encontre no arquivo trace o Predicate Pusling.
SQL> CONN HR/HR
SQL> ALTER SESSION SET EVENTS '10053 TRACE NAME CONTEXT FOREVER, LEVEL 1';
SQL> SELECT E1.LAST_NAME, E1.SALARY, V.AVG_SALARY
FROM EMPLOYEES E1,
(SELECT DEPARTMENT_ID, AVG(SALARY) AVG_SALARY
FROM EMPLOYEES E2
GROUP BY DEPARTMENT_ID) V
WHERE E1.DEPARTMENT_ID = V.DEPARTMENT_ID
AND E1.SALARY > V.AVG_SALARY
AND E1.DEPARTMENT_ID = 60;
174
E csom. D/EPARTMENT_ID/ IN (20,40,60)?
DBMS_SQLTUNE
175
DBMS_SQLTUNE
176
Lab 8.1: DBMS_SQLTUNE
SQL> CONN SCOTT/TIGER
SQL> CREATE TABLE T8 AS SELECT * FROM ALL_OBJECTS;
SQL> SELECT COUNT(DISTINCT(OWNER)) FROM T8;
SQL> SELECT SQL_ID FROM V$SQL WHERE SQL_TEXT LIKE ‘%T8%’;
178
Join Metlods
• Nested Liips
• Hash Jiins
• Sirt-merge Jiins
Driving Table (maiir / OUTER / BUILD / PK / UNIQUE) / Pribe Table (menir / INNER):
180
Nested Loops
• É um LOOP dentri de um LOOP.
• É mais eficiente cim pequenis Result Sets;
• Geralmente icirre quandi há índices nas cilunas utlizadas peli Jiin;
• Utliza piuca memória, piis i Result Set é cinstruídi uma linha pir vez;
• HINT: /*+ leading(ORDER_ITENS ORDERS) use_nl(ORDERS) index(ORDERS(ORDER_ID)) */
• HINT: /*+ leading(ORDERS ORDER_ITENS) use_nl(ORDER_ITENS)
index(ORDER_LINES(ORDER_ID)) */
181
Nested Loops
SQL> SELECT EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO =
DEPT.DEPTNO AND DEPT.DEPTNO IN (10);
SQL> SELECT EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO =
DEPT.DEPTNO AND DEPT.DEPTNO IN (10,20);
SQL> SELECT EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO =
DEPT.DEPTNO;
182
Nested Loops
SQL> CONN SCOTT/TIGER
183
Sort-Merge Joins
184
Sort-Merge Joins
• Lê as duas tabelas de firma independente, irdena, e junta is Result Sets, descartandi linhas
que nãi cimbinam;
• Geralmente é utlizadi para Result Sets maiires, e quandi nãi há índices;
• Geralmente é utlizadi quandi é uma iperaçãi de desigualdade;
• O maiir custi é a irdenaçãi;
• Piderá ser utlizada apenas PGA, iu pide ser necessárii TEMP;
• HINTs: USE_MERGE / NO_USE_MERGE
SQL> SELECT EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO =
DEPT.DEPTNO AND DEPT.DEPTNO NOT IN (10);
185
Hasl Joins
●
Só icirre em equi-jiins;
●
Geralmente é utlizadi para grandes Result Sets;
●
Geralmente é utlizadi se i menir Result Set cabe em memória;
●
A tabela cim i menir Result Set é lida e armazenada em memória cimi um HASH;
●
Em seguida a iutra tabela (maiir Result Set) é lida, é aplicadi i HASH, e entãi cimparada cim
a menir;
●
Piderá ser utlizada apenas PGA, iu pide ser necessárii TEMP;
186
Hasl Joins
187
Hash Joins
SQL> CONN SCOTT/TIGER
SQL> SET AUTOTRACE TRACEONLY EXPLAIN
188
Cartesian Joins / Cross Joins
●
Geralmente trata-se da ausência de cindiçãi di Jiin (DISTINCT!);
●
O tamanhi di resultadi é i priduti dis diis Result Sets;
●
Piderá ser utlizada apenas PGA, iu pide ser necessárii TEMP.
189
Cartesian Joins / Cross Joins
190
Outer Joins
●
Sintaxe Oracle: (+);
●
A sintaxe Oracle nãi supirta FULL OUTER JOIN;
●
Sintaxe ANSI: LEFT [OUTER] JOIN / RIGHT [OUTER] JOIN;
●
Um OUTER JOIN pide utlizar qualquer métidi de JOIN;
●
12c: Mult-table LEFT OUTER JOIN.
191
Semi-Joins (IN)
●
Cintrile: HINTs SEMIJOIN, NO_SEMIJOIN, NL_SJ, MERGE_SJ, HASH_SJ
●
Uma itmizaçãi de INNER JOIN, de custi menir;
●
Utlizadi em listas IN iu EXISTS;
●
É necessárii utlizar uma Subquery;
●
Se fir utlizadi EXISTS, é necessárii utlizar uma Cirrelated Subquery;
●
As cláusulas IN iu EXISTS nãi pidem estar dentri de um OR.
192
Semi-Joins (EXISTS)
SQL> CONN HR/HR
SQL> SELECT DEPARTMENT_NAME
FROM DEPARTMENTS DEPT
WHERE EXISTS
(SELECT NULL
FROM HR.EMPLOYEES EMP
WHERE EMP.DEPARTMENT_ID = DEPT.DEPARTMENT_ID);
193
Ant-Joins (NOT IN)
●
Uma itmizaçãi de INNER JOIN, de custi menir;
●
Utlizadi em listas NOT IN iu NOT EXISTS;
●
É necessárii utlizar uma Subquery;
●
Se fir utlizadi NOT EXISTS, é necessárii utlizar uma Cirrelated Subquery;
●
As cláusulas NOT IN iu NOT EXISTS nãi pidem estar dentri de um OR;
●
A Subquery nãi pide retirnar NULL (<=10g) (SNA).
●
Cintrile: HINTs ANTIJOIN, NL_AJ, MERGE_AJ, HASH_AJ
●
Cintrile: Parâmetris _always_ant, _gs_ant_semi_jiin_alliwed,
_iptmizer_null_aware_antjiin, _iptmizer_iuter_ti_ant_enabled
194
Ant-Joins (NOT IN)
SQL> SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID NOT IN
(SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE LOCATION_ID = 1700)
ORDER BY LAST_NAME;
195
Anti-Joins (NOT EXISTS)
SQL> SELECT DEPARTMENT_NAME
FROM DEPARTMENTS DEPT
WHERE NOT EXISTS
(SELECT NULL
FROM EMPLOYEES EMP
WHERE EMP.DEPARTMENT_ID = DEPT.DEPARTMENT_ID);
196
Bloom Filters
●
Cintrile: HINTs PX_JOIN_FILTER, NO_PX_JOIN_FILTER;
●
Utliza piuca memória para i filtri em relaçãi di cinjunti de dadis;
●
É mais utlizadi quandi a maiiria das linhas sãi descartadas em um JOIN;
●
Reduz a quantdade de dadis transferidis entre pricessis paralelis;
●
É mais utlizadi se mais partções firem eliminadas pir Parttin Pruning;
●
Pide utlizar Result Cache;
●
É utlizadi em Exatada, especialmente em JOINs em STAR SCHEMAs.
197
Partton-wise Joins
●
Ni parttin-wise jiin
198
Partton-wise Joins
●
Full parttin-wise jiin
●
Partal parttin-wise jiins
199
Índices
200
Índices
●
B-tree
●
Bitmap
●
Bitmap Jiin
●
IOT (Index-Organized Table)
●
Functin-Based
●
Bitmap Functin-Based
●
Reverse Key
●
Invisible Indexes (11g / OPTIMIZER_USE_INVISIBLE_INDEXES)
●
Virtual Indexes (_use_nisegment_indexes)
●
Parttined Indexes
●
Partal Indexes (12c)
●
Dimain Indexes
●
Cimpressed
●
Ascending / Descending
●
Table Clusters
201
Índices
Bitmap Join
SQL> CREATE BITMAP INDEX cust_sales_bji
ON sales(customers.state)
FROM sales, customers
WHERE sales.cust_id = customers.cust_id;
IOT
CREATE TABLE locations
(id NUMBER(10) NOT NULL,
description VARCHAR2(50) NOT NULL,
map BLOB,
CONSTRAINT pk_locations PRIMARY KEY (id)
)
ORGANIZATION INDEX
TAB LESPACE iot_tablespace
PCTTHRESHOLD 20
INCLUDING description
OVERFLOW TABLESPACE overflow_tablespace;
Reverse
CREATE INDEX bowie_reverse_idx ON bowie(id) REVERSE;
202
Índices
Invisible
SQL> ALTER INDEX IDX_T INVISIBLE;
SQL> ALTER INDEX IDX_T VISIBLE;
Virtual
SQL> CREATE INDEX IDX_T ON T(OBJECT_NAME) NOSEGMENT;
Functon Based
SQL> CREATE INDEX IDX_T ON T(UPPER(OBJECT_NAME));
203
Índices - Table Clusters
• Utlize se as tabelas sãi frequentemente utlizadas em JOINs (NF e ITEM_NF);
• Utlize se as tabelas sifrem mais JOINs di que iperações DML;
• Evite se é utlizadi FTS de apenas uma das tabelas;
• Evite para linhas largas (PEDIDO_NOTA_FISCAL cim OBS);
• Evite se i númeri de linhas nas chaves das duas tabelas é muiti diferente.
204
Índices e Access Patls
205
Índices e Access Patls
206
Índices - Guidelines
Geral
●
Cintrile: HINTs INDEX, INDEX_COMBINE, NO_INDEX, FULL;
●
Crie índices em cilunas utlizadas na cláusula WHERE;
●
Crie índices em cilunas utlizadas em JOINs;
●
Crie índices em cilunas de alta seletvidade;
●
Crie índices em cilunas de baixa seletvidade mas que cintenham dadis cim seletvidades
muiti distntas;
●
Prefira índices PRIMARY KEY, se i mideli permitr;
●
Prefira índices UNIQUE, se i mideli permitr, mas PRIMARY KEY nãi é pissível;
●
Crie índices cimpistis em cilunas utlizadas frequentemente na mesma cláusula WHERE;
●
Em índices cimpistis, utlize as cilunas cim maiir seletvidade à esquerda;
●
Se um valir de uma ciluna indexada nãi fir utlizadi em uma cláusula WHERE, verifique se
este valir pide ser tricadi para NULL;
●
Busque sempre minimizar a quantdade de índices de uma tabela;
●
Cinsidere i espaçi utlizadi pir um índice (60% - 40%).
207
Índices - Guidelines
DML
●
Crie índices em Fireign Keys (FKs) que sifrem DML de firma cincirrente;
●
Evite índices em cilunas que sifrem muitis UPDATEs;
●
Evite índices em tabelas que sifrem muitis INSERTs iu DELETEs.
Tipos
●
Prefira índices BTREE em cilunas de alta seletvidade (CPF, NF);
●
Prefira índices BITMAP em cilunas de baixa seletvidade (ESTADO, CIDADE);
●
Evite índices em cilunas utlizadas em cláusula WHERE apenas cim funções;
●
Prefira índices BITMAP para grandes tabelas;
●
Evite índices BITMAP em cilunas que sifrem muiti DML, principalmente de firma
cincirrente;
●
Prefira partções HASH em índices pequenis que sifrem DML em alta cincirrência;
●
Utlize IOTs em PKs frequentemente utlizadas na cláusula WHERE;
●
Utlize Functin Based Index em cilunas utlizadas em cláusula WHERE mais frequentemente
cim funções;
●
Utlize índices REVERSE em cilunas que sifrem DML em alta cincirrência;
●
Se um valir de uma ciluna indexada utlizadi em uma cláusula WHERE fir rari,
cinsidere um Functin Based Index:
CREATE INDEX IDX_ORDER_NEW
ON ORDERS(CASE STATUS WHEN 'N' THEN 'N' ELSE NULL END);
208
BITMAP x BTREE
SQL> SELECT COUNT(*) FROM T4; - - Sem índice.
COUNT(1)
———
10936000
210
Lab 9.1: DML e BITMAP Index
1a Sessão: 2a Sessão:
SQL> CREATE BITMAP INDEX
IDX_BITMAP_T314 ON T314(C1);
SQL> INSERT INTO T314 VALUES (1); SQL> INSERT INTO T314 VALUES (10);
SQL> INSERT INTO T314 VALUES (1); SQL> INSERT INTO T314 VALUES (1);
SQL> INSERT INTO T314 VALUES (1); SQL> INSERT INTO T314 VALUES (10);
SQL> INSERT INTO T314 VALUES (10); SQL> INSERT INTO T314 VALUES (1);
211
Lab 9.2: Impacto de Índices
Execute novamente o mellor script de INSERT, mas com a adição de índices como abaixo.
$ cd /home/oracle
$ time perl ConnectGOOD_CommitGOOD_BindsGOOD_PERFECT.pl 10000
$ time perl ConnectGOOD_CommitGOOD_BindsGOOD_PERFECT.pl 10000
$ time perl ConnectGOOD_CommitGOOD_BindsGOOD_PERFECT.pl 10000
212
Lab 9.3: Impacto de Índices
Com o usuário SCOTT, crie uma tabela de testes, e verifque o tempo de sua duplicação.
SQL> CREATE TABLE T91 AS SELECT * FROM ALL_OBJECTS;
SQL> INSERT INTO T91 SELECT * FROM T91;
SQL> INSERT INTO T91 SELECT * FROM T91;
SQL> INSERT INTO T91 SELECT * FROM T91;
SQL> INSERT INTO T91 SELECT * FROM T91;
SQL> COMMIT;
213
Lab 9.4: Impacto de Índices
Verifque o tempo de sua duplicação, mas com índices.
SQL> CREATE INDEX T92_IDX_01 ON T92(OWNER);
SQL> INSERT INTO T92 SELECT * FROM T91;
SQL> TRUNCATE TABLE T92;
SQL> INSERT INTO T92 SELECT * FROM T91;
SQL> TRUNCATE TABLE T92;
SQL> INSERT INTO T92 SELECT * FROM T91;
SQL> TRUNCATE TABLE T92;
214
Lab 9.5: Impacto de Índices
Verifque o tempo de sua duplicação, mas um índice composto.
SQL> DROP INDEX T92_IDX_01;
SQL> DROP INDEX T92_IDX_02;
SQL> CREATE INDEX T92_IDX_03 ON T92(OWNER,OBJECT_NAME);
SQL> INSERT INTO T92 SELECT * FROM T91;
SQL> TRUNCATE TABLE T92;
SQL> INSERT INTO T92 SELECT * FROM T91;
SQL> TRUNCATE TABLE T92;
SQL> INSERT INTO T92 SELECT * FROM T91;
SQL> TRUNCATE TABLE T92;
215
Lab 9.6: Impacto de Índices
Verifque o uso dos índices.
SQL> CONN SCOTT/TIGER
SQL> DROP INDEX T92_IDX_03;
SQL> INSERT INTO T92 SELECT * FROM T91;
SQL> CREATE INDEX T92_IDX_01 ON T92(OWNER);
SQL> CREATE INDEX T92_IDX_02 ON T92(OBJECT_NAME);
SQL> ALTER INDEX T92_IDX_01 MONITORING USAGE;
SQL> ALTER INDEX T92_IDX_02 MONITORING USAGE;
217
Estatstcas e SQL Engine
Optmizer Statstcs
Table statstcs
Number if riws
Number if blicks
Average riw length
Cilumn statstcs
Number if distnct values (NDV) in cilumn
Number if nulls in cilumn
Data distributin (histigram)
Extended statstcs
Index statstcs
Number if leaf blicks
Average data blicks per Key
Levels
Index clustering factir
System Statstcs
I/O perfirmance and utlizatin
CPU perfirmance and utlizatin
218
Estatstcas - 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;
219
Estatstcas - Í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;
220
Estatstcas - 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;
221
Coleta de Estatísticas - 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;
222
Quando coletar? Coleta automátca
Quando coletar? Coleta automátca
Quando coletar? Coleta automátca
Quando coletar? OPTIMIZER_DYNAMIC_SAMPLING
Nível 0 = Nãi há cileta.
Nível 1 = Cileta 32 blicis.
Se há peli menis 1 tabela partciinada ni SQL sem estatstcas.
Se esta tabela nãi tem índices.
Se esta tabela tem mais que 64 blicis.
Nível 2 = Cileta 64 blicis.
Cileta se há peli menis uma tabela di SQL sem estatstcas.
Nível 3 = Cileta 64 blicis.
Cileta se i Nível 2 é atendidi OU se é utlizada expressãi ni WHERE.
Nível 4 = Cileta 64 blicis.
Cileta se i nível 3 é atendidi OU se i SQL utliza AND iu OR entre múltplis predicadis.
Nível 5 = Cileta 128 blicis.
Cileta se i nível 4 é atendidi.
Nível 6 = Cileta 256 blicis.
Cileta se i nível 4 é atendidi.
Nível 7 = Cileta 512 blicis.
Cileta se i nível 4 é atendidi.
Nível 8 = Cileta 1024 blicis.
Cileta se i nível 4 é atendidi.
Nível 9 = Cileta 4086 blicis.
Cileta se i nível 4 é atendidi.
Nível 10 = Cileta tidis is blicis.
Cileta se i nível 4 é atendidi.
Nível 11 (Adaptve Dynamic Sampling: >= 11.2.0.4) = Cileta ? Blicis. Cileta quandi?
Lab 10.1: Coleta de Estatstcas
Verifque os planos de execução dos SQL abaixo.
SQL> CONN SCOTT/TIGER
SQL> SET AUTOTRACE ON EXPLAIN
SQL> SELECT ID, NAME FROM T1 WHERE ID = 1;
SQL> SELECT ID, NAME FROM T2 WHERE ID = 1;
SQL> SELECT ID, NAME FROM T1 WHERE ID < 5;
SQL> SELECT ID, NAME FROM T2 WHERE ID < 5;
SQL> SELECT ID, NAME FROM T1 WHERE ID < 10;
SQL> SELECT ID, NAME FROM T2 WHERE ID < 10;
227
Estatísticas: Coleta Manual
Coleta de todos os objetos.
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');
228
228
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
Estatstcas - 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;
230
Como coletar? Histogramas
METHOD_OPT
FOR ALL COLUMNS SIZE AUTO
FOR ALL [INDEXED | HIDDEN] COLUMNS SIZE [N | REPEAT | AUTO | SKEWONLY]
FOR COLUMNS csolum.n 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
Lab 10.2: Coleta de Estatstcas
Verifque os planos de execução dos SQL abaixo.
SQL> SELECT COUNT(OBJECT_TYPE), OBJECT_TYPE FROM T91 GROUP BY OBJECT_TYPE
ORDER BY 1;
SQL> CREATE INDEX IND_T91_01 ON T91(OBJECT_TYPE);
SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS('SCOTT','T91');
SQL> SET AUTOTRACE ON EXPLAIN
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'SYNONYM';
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'PACKAGE';
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'TABLE';
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'DIRECTORY';
233
Heiglt Balanced Histograms
Utlizados se:
- Se i númeri de Buckets indicadis na cileta (iu i máximi) é menir que i NDV.
234
Top Frequency Histograms (12c)
Utlizados se:
- Se i NDV é maiir que a quantdade de Buckets indicadis na cileta (iu i máximi);
- É utlizadi AUTO_SAMPLE_SIZE na execuçãi da cileta;
- Se i percentual de linhas icupadas pelis Tip Values é igual iu maiir que p, sendi que p = (1-
(1/Buckets))*100.
235
Hybrid Histograms (12c)
Utlizados se:
- Se i númeri de Buckets indicadis na cileta (iu i máximi) é menir que i NDV;
- É utlizadi AUTO_SAMPLE_SIZE na execuçãi da cileta;
- Se is critétis para Tip Frequency Histigrams nãi se aplicam.
236
Histogramas
- Buckets: máximi de 254 / 127 (2048 ni 12c);
- Frequency Histigrams;
- Height-Balanced Histigrams;
- Tip Frequency Histigrams (12c);
- Hybrid Histigrams (12c).
Problemas:
- Cilunas que nãi precisam de Histigramas;
- Custi de cileta;
- Sensibilidade a cileta pir SAMPLE;
- Sensibilidade a mimenti da cileta (Nivis pedidis às 22:00?);
- Bind Variables (pré ACS);
- Frequency: Se um valir nãi está em um Bucket, será cinsiderada metade da cardinalidade di
valir menis pipular;
- Height-Balanced: Se um valir nãi é pipular (só está em 1 Bucket), será cinsiderada a
cardinalidade = númeri de linhas nãi pipulares / númeri de valir nãi pipulares (11gR2).
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');
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
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');
Como coletar? Coleta de exceção
● HINT /*+ GATHER_PLAN_STATISTICS */
● Parâmetri STATISTICS_LEVEL = ALL
Como coletar? Coleta de exceção
OU
OU
$ unzip -q swingbench261046.zip
$ cd /home/oracle/swingbench/bin/
$ ./charbench -uc 10 -cs //nerv01/PROD -c ../configs/SOE_Server_Side_V2.xml
...
244
Extended Statstcs – Column Groups e Expression
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS( 'SH','CUSTOMERS',
METHOD_OPT=>'FOR ALL COLUMNS SIZE SKEWONLY ' || 'FOR COLUMNS SIZE
SKEWONLY (CUST_STATE_PROVINCE,COUNTRY_ID)');
245
245
Estatstcas Pendentes
246
Lab 10.4: Estatstcas Pendentes
Colete estatstcas, e verifque-as antes de publica-las.
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;
247
optimizer_use_pending_statistics
Restore de Estatstcas
248
Lab 10.5: Restore de Estatstcas
Execute o Restore de uma estatstca anterior.
SQL> CONN SCOTT/TIGER
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='T92'
AND OWNER='SCOTT'
ORDER BY STATS_UPDATE_TIME DESC;
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'T92');
EXEC DBMS_STATS.RESTORE_SCHEMA_STATS('SCOTT',TO_TIMESTAMP('2018-03-
03:16:11:14','YYYY-MM-DD:HH24:MI:SS') );
249
Transporte de Estatstcas
250
Transporte de Estatstcas
Origem
EXEC DBMS_STATS.CREATE_STAT_TABLE (ownname => 'HR', stattab =>
TESTE_STATS'));
Destno:
$ impdp HR/HR DIRECTORY=dump_directory DUMPFILE=TESTE_STATS.dmp
TABLES=TESTE_STATS
251
Otmizações
252
SQL ou PL/SQL?
“SQe. vocsê tpo e. fdze.ra dlgo e.m. SQL/, fdçd-o e.m. SQL/.
SQe. vocsê não tpo e. fdze.-lo e.m. SQL/, fdçd e.m. P///SQL/.
SQe. vocsê não tpo e. fdze.-lo e.m. P///SQL/, fdçd e.m. Jdvd.
SQe. vocsê não tpo e. fdze.-lo e.m. Jdvd, fdçd e.m. C++.
SQe. vocsê não tpo e. fdze.ra e.m. C++, não o fdçd.”
Thimas Kyte
- O que. vocsê dtprae.n e.u dob.rae. csdraraod, qudn o dtprae.n e.u d iraigira?
- Ludnto te.m.tpo vocsê le.vou tpdrad dtprae.n e.ra SQL/? 253
- Utlizdm.od dtpe.ndd cse.racsd e. 20% dd csdtpdcsi d e.d e. um. tpraogradm.d ou lingudge.m..253
Rows x Sets
254
Rows x Sets
Isto não representa uma tabela!
255
Rows x Sets
Quais são os funcionários que ganlam mais do que a média de seu departamento.
Método procedural:
- Calcule a média salarial de cada departamenti;
- Armazene a média de firma tempirária;
- Liste tidis is empregadis e seu departamenti;
- Cimpare i salárii de cada empregadi cim a média de seu departamenti;
- Liste tidis is empregadis que tem i salárii acima da média.
256
Rows x Sets
Quais os empregados que passaram a mesma quantdade de anos em cada cargo ocupado?
Método procedural:
- Listar tidis is empregadis;
- Listas tidis is cargis, data inicial e final destes empregadis, calculandi a quantdade de anis;
- Armazenar estes dadis em firmati tempirárii;
- Para cada empregadi, verificar se tidis as quantdades de anis sãi iguais;
- Descartar is empregadis que nãi pissuem tidas as quantdade de anis iguais.
257
Rows x Sets
Qual a quantdade média de dias entre os pedidos de um cliente?
Método procedural:
- Liste tidis is pedidis di cliente X;
- Seleciine is pedidis e suas datas;
- Para cada pedidi, seleciine a data di pedidi anteriir;
- Calcule qual a quantdade de dias entre a data di pedidi e a data anteriir;
- Calcule a média destas quantdades.
258
Rows x Sets
Crie uma tabela com os clientes pequenos, outra com os clientes médios, e outra com os clientes grandes.
Método procedural:
- Seleciinar is clientes que cimpraram menis de 10000;
- Inseri-lis na tabela SMALL_CUSTOMERS;
- Seleciinar is clientes que cimpraram entre 10000 e 99999;
- Inseri-lis na tabela MEDIUM_CUSTOMERS;
- Seleciinar is clientes que cimpraram mais de 100000;
- Inseri-lis na tabela LARGE_CUSTOMERS;
259
Rows x Sets
Altere o bônus para 20% de quem é candidato mas ainda não tem bônus, remova de quem ganla mais de
7.500, e marque como 10% o bônus de quem ainda não é candidato mas recebe menos que 7.500.
Método procedural:
- Seleciine is empregadis que devem receber a alteraçãi de 20%;
- Faça a alteraçãi dis empregadis que devem receber a alteraçãi de 20%;
- Seleciine is empregadis que devem receber a alteraçãi de 10%;
- Faça a alteraçãi dis empregadis que devem receber a alteraçãi de 10%;
- Seleciine is empregadis que nãi devem mais ser candidatis a bônus;
- Remiva is empregadis que nãi devem mais ser candidatis a bônus.
260
Otmizações Gerais
●
Menis é mais.
●
A qualidade di trabalhi di CBO é inversamente pripirciinal ai tamanhi di SQL.
●
O CBO pide ser beneficiadi pir CONSTRAINTs em SELECTs (Query Transfirmatin).
●
Evite funções na cláusula WHERE.
●
Evite DISTINCT, se pissível.
●
Evite ORDER BY, se pissível.
●
Prefira UNION ALL a UNION, se pissível.
●
SELECT COL1, COL2 … ai invés de SELECT * … irá ecinimizar SQL*Net e PGA.
●
Pricure reduzir i tamanhi di SQL (Shared Piil).
●
Prefira SQL, se lhe atender.
●
Stired Pricedures pidem reduzir tráfegi de rede.
●
Stired Pricedures firçam i usi de BINDs.
●
Evite tricar entre PL/SQL e SQL (cintext switch).
●
Evite acessi desnecessárii a DUAL (iperações aritmétcas, SEQUENCEs).
●
Em PL/SQL, evite Riw-by-Riw.
●
Em PL/SQL, evite Nested Riw-by-Riw.
●
Utlize variáveis BIND em SQLs repettvis.
●
Variáveis BINDs impedem SQL Injectin.
●
Nãi utlize Binds se i tempi tital de cimpilaçãi nãi fir relevante quanti ai tempi tital de
respista.
●
Utlize CACHE em Sequences, se pissível (em RAC, adiciine NOORDER, se pissível).
261
Otmizações Gerais
●
A maneira mais rápida de se fazer um grande UPDATE / DELETE é nãi fazer. Faça CTAS.
●
Em alterações em lite, desabilite as CONSTRAINTs, se pissível.
●
Em alterações em lite, remiva is índices, se pissível.
●
Em alterações em lite, cinsidere i PARALLELISM.
●
Em INSERT em lite, cinsidere i usi APPEND (Direct Path).
●
TRUNCATE nãi gera REDO e UNDO, nãi dispara Triggers, e abaixa a HWM.
●
Cinheça BULK BINDING (LOOP cim FORALL).
●
Cinheça INSERT cim BULK COLLECT.
●
Cinheça INSERT cim Pipelined Table Functin
●
Estude i SQL*Liader / External Tables.
●
Trique UTL_FILE pir EXTERNAL TABLES.
●
Em geral, Segurança (Auditiria, Criptigrafia, etc.) prejudica Desempenhi.
●
Evite WHERE CAMPO LIKE 'A%' em cilunas de baixa seletvidade.
●
Evite mais ainda WHERE CAMPO LIKE '%A%'.
●
Se precisar utlizar LIKE '%A%', implemente Oracle Text.
●
Estude a funçãi MERGE.
●
Estude a Cláusula WITH.
●
Estude as Funções Analítcas.
●
Estude Queries Hierárquicas (CONNECT BY).
●
Cinsidere Materialized Views.
●
Evite i abusi de VIEWs, TRIGGERs, DBLINKs.
262
Lab 11.1: Append e Redo
Crie uma tabela de testes, e execute uma gravação, com parâmetros diferentes.
SQL> CONN SCOTT/TIGER
SQL> CREATE TABLE T111 AS SELECT * FROM ALL_OBJECTS WHERE 1=0;
263
Paralelismo
Permite Query, DML e DDL.
264
Paralelismo
Parâmetros:
PARALLEL_MIN_SERVERS = Númeri entre 0 e PARALLEL_MAX_SERVERS.
PARALLEL_MAX_SERVERS = De 0 a 3600.
PARALLEL_MIN_PERCENT = De 0 a 100.
PARA//E/_AUTOMATIC_TUNING: D/e.tprae.csdte. .
PARA//E/_IO_CAP_ENAB/ED/ = D/e.tprae.csdte. .
265
Paralelismo
SQL> SELECT SID, SERIAL#, QCSID, QCSERIAL# FROM V$PX_SESSION;
266
Lab 11.2: Paralelismo
Abra a sessão com o SCOTT com SET TIMING ON.
Em seguida, faça o teste do PARALLEL.
SQL> CONN SCOTT/TIGER
SQL> CREATE TABLE T112 AS SELECT * FROM ALL_OBJECTS;
7 x SQL> INSERT INTO T112 SELECT * FROM T112;
SQL> COMMIT;
267
Lab 11.3: RESULT_CACHE
Execute o teste do RESULT_CACHE.
SQL> CONN SCOTT/TIGER
268
Compression
●
9i OLAP
●
11g OLTP
●
12c InMemory
269
Lab 11.4: Compression
Execute o teste do COMPRESSION.
SQL> SET TIMING ON
SQL> SELECT COUNT(*) FROM T112;
SQL> SELECT COUNT(*) FROM T112;
SQL> SELECT COUNT(*) FROM T112;
270
Lab 11.5: CTAS
Execute o teste de DELETE x CTAS (CREATE TABLE AS SELECT).
SQL> SELECT COUNT(*) FROM T113;
SQL> SELECT COUNT(*) FROM T113 WHERE OBJECT_TYPE = 'SYNONYM';
271
Extração de Planos de Execução
272
Fontes de Planos de Execução
- PLAN_TABLE, carregada pir EXPLAIN PLAN / DBMS_XPLAN.DISPLAY iu AUTOTRACE (e SQL
Develiper, Tiad, etc.);
- VIEWs de planis cimpiladis e armazenadis na Library Cache;
- Tabelas de AWR / STATSPACK;
- Arquivis Trace (10046, 10053, etc.).
273
Explain Plan
Sintaxe:
EXPLAIN PLAN [SET STATEMENT_ID=id] [INTO table] FOR statement;
Exemplo:
SQL> EXPLAIN PLAN SET STATEMENT_ID='TESTE1' FOR
SELECT ENAME FROM EMP;
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
275
Lab 12.2: Explain Plan
Execute o SQL abaixo duas vezes, comparando o Plano de Execução.
$ sqlplus SCOTT/TIGER
SQL> CREATE TABLE T1122 AS SELECT * FROM ALL_OBJECTS;
SQL> CREATE INDEX T1122_IDX1 ON T1122(OBJECT_ID);
SQL> CREATE TABLE T2122 AS SELECT * FROM ALL_OBJECTS;
SQL> CREATE INDEX T2122_IDX1 ON T2122(OBJECT_ID);
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'T1122');
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'T2122');
STATSPACK
@$ORACLE_HOME/rdbms/admin/sprepsql.sql
277
277
AWR / Statspack
Tabelas:
- STATS$SQL_PLAN (STATSPACK)
- DBA_HIST_SQL_PLAN
- DBA_HIST_SQLTEXT
- DBA_HIST_SQLSTAT
- DBA_HIST_SQLBIND
Exemplo:
SQL> SELECT SQL_ID, SQL_TEXT FROM DBA_HIST_SQLTEXT
WHERE SQL_TEXT LIKE '%SELECT ENAME FROM EMP%';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('a10jnjwd22gs8'));
278
Views
Dynamic Performance Views:
- V$SQL_PLAN
- V$SQL_PLAN_STATISTICS
- V$SQL_WORKAREA
- V$SQL_PLAN_STATISTICS_ALL (V$SQL_PLAN_STATISTICS + V$SQL_WORKAREA)
DISPLAY_CURSOR
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(SQLID, CHILD_NUMBER,
FORMAT));
FORMAT
- TYPICAL = DEFAULT
– ALL = TYPICAL + QB + PROJECTION + ALIAS + REMOTE
– ADVANCED = ALL + OUTLINE + BINDS
– ALLSTATS = IOSTATS + MEMSTATS (all executions)
– ALLSTATS LAST (last execution)
– ADAPTIVE (12c)
279
Executon Plan
SQL> CONN SCOTT/TIGER
SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS('SCOTT','T91');
SQL> SELECT /*+ GATHER_PLAN_STATISTICS */ COUNT(OBJECT_NAME) FROM T91 WHERE
OBJECT_TYPE = 'SYNONYM';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
280
280
Executon Plan
SQL> CONN SCOTT/TIGER
SQL> EXEC DBMS_STATS.DELETE_SCHEMA_STATS(USER);
SQL> SELECT EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO
AND DEPT.DEPTNO IN (10);
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO
AND DEPT.DEPTNO IN (10,20);
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT /*+ GATHER_PLAN_STATISTICS */ EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND DEPT.DEPTNO IN (10);
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT /*+ GATHER_PLAN_STATISTICS */ EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND DEPT.DEPTNO IN (10,20);
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT /*+ GATHER_PLAN_STATISTICS */ EMPNO, ENAME, DNAME, LOC FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
281
281
Executon Plan
282
282
Executon Plan
SQL> CONN / AS SYSDBA
SQL> ALTER SYSTEM SET STATISTICS_LEVEL=ALL;
283
283
Executon Plan
SQL> CONN SCOTT/TIGER
SQL> COL SQL_TEXT FORMAT A150
SQL> SELECT SQL_ID, CHILD_NUMBER, SQL_TEXT FROM V$SQL WHERE SQL_TEXT LIKE '%T91%';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('fnjnr3c42v3fr', NULL, 'ALLSTATS
LAST'));
284
284
Executon Plan
285
285
Executon Plan
SQL> CONN SCOTT/TIGER
SQL> ALTER SESSION SET OPTIMIZER_DYNAMIC_SAMPLING = 0;
SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T91');
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'TABLE';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'DIRECTORY';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'SYNONYM';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
286
286
Executon Plan
SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T91');
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T91', ESTIMATE_PERCENT=>100,
METHOD_OPT=>'FOR ALL COLUMNS SIZE 1');
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'TABLE';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'DIRECTORY';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'SYNONYM';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
287
287
Executon Plan
SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T91');
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T91', ESTIMATE_PERCENT=>100,
METHOD_OPT=> 'FOR ALL COLUMNS SIZE 5');
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'TABLE';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'DIRECTORY';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'SYNONYM';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
288
288
Executon Plan
SQL> EXEC DBMS_STATS.DELETE_TABLE_STATS(USER, 'T91');
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T91');
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'TABLE';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'DIRECTORY';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
SQL> SELECT COUNT(OBJECT_NAME) FROM T91 WHERE OBJECT_TYPE = 'SYNONYM';
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));
289
289
Adaptve Plans
290
290
Lab 12.3: Adaptve Plans
Execute o SQL abaixo duas vezes, comparando o Plano Real de Execução.
SQL> ALTER SYSTEM SET STATISTICS_LEVEL=ALL;
$ sqlplus OE/OE
SQL> SELECT o.order_id, v.product_name
FROM orders o,
( SELECT order_id, product_name
FROM order_items o, product_information p
WHERE p.product_id = o.product_id
AND list_price < 50
AND min_price < 40 ) v
WHERE o.order_id = v.order_id;
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'+ALLSTATS'));
292
Lab 12.5: Adaptve Plans
Execute o SQL abaixo duas vezes, comparando o Plano Real de Execução.
$ sqlplus OE/OE
EXPLAIN PLAN FOR
SELECT product_name FROM order_items o, product_information p
WHERE o.unit_price = 15
AND quantity > 1
AND p.product_id = o.product_id;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
293
SQLT
294
Lab 13.1: SQLT - Instalação
MOS Doc ID 215187.1: SQLT Diagnostc Tool
295
Lab 13.2: SQLTXPLAIN - Extração
Verifque os SQL_ID dos SQL executados pelos dois SCHEMAS.
$ cd /home/oracle
SQL> CONN / AS SYSDBA
SQL> @SQLT.sql
SQL> SELECT SQL_ID, CHILD_NUMBER, SQL_TEXT FROM V$SQL WHERE
PARSING_SCHEMA_NAME = 'SHSB' AND CHILD_NUMBER > 2 ORDER BY 2
DESC;
296
Análise de Planos de Execução
297
Análise de Plano
298
Análise de Plano
- Stand-alone Operatons: apenas uma iperaçãi filhi;
- Unrelated-combine Operatons: iperações filhi sãi executadas de firma independente;
AND/-ELUA/, BITMAP AND/, BITMAP MINUSQ, CONCATENATION, CONNECT BY WITHOUT
FI/TERING, HASQH JOIN, INTERSQECTION, MERGE JOIN, MINUSQ, MU/TI_TAB/E INSQERT, SQL/
MOD/E/, TEMP TAB/E TRANSQFORMATION, UNION-A//.
- Related-combine Operatons: a primeira iperaçãi filhi é executada apenas uma vez, e
cintrila a execuçãi das iutras iperações filhi, de firma intercalada;
NESQTED/ /OOPSQ, UPD/ATE, CONNECT BY WITH FI/TERING, BITMAP KEY ITERATION;
- Blocking Operatons (SORT)
- Nonblocking Operatons (FILTER)
299
Não há tpldnod e. e.xe.csução ifcse.id, dom.e.nte. longod.
J/
Stand-alone Operaton
300
300
Stand-alone Operaton - STOPKEY
301
301
Stand-alone Operaton - STOPKEY
302
302
Stand-alone Operaton - FILTER
303
303
Unrelated-combine Operaton
304
304
Related-combine Operaton
305
305
O que procurar?
- Pinti de aumenti de Cist iu Riws.
- Diferença entre A-Riws e E-Riws.
- Nested Liips cim grande quantdade de Starts.
- FTS / FIS em ibjetis cim filtris.
- Desperdícii:
--------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 0 |
| 1 | MERGE JOIN | | 1 | 10 | 0 |
|* 2 | TABLE ACCESS BY INDEX ROWID | T1 | 1 | 10 | 10 |
| 3 | INDEX FULL SCAN | T1_PK | 1 | 10000 | 10000 |
|* 4 | SORT JOIN | | 10 | 10 | 0 |
|* 5 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 10 | 10 |
| 6 | INDEX FULL SCAN | T2_PK | 1 | 10000 | 10000 |
--------------------------------------------------------------------------
306
Lab 14.1: Análise de Plano
Execute o SQL abaixo e analise seu plano de execução.
SQL> CONN HR/HR
SQL> SELECT e.employee_id, j.job_title, e.salary, d.department_name
FROM employees e, jobs j, departments d
WHERE e.employee_id < 103
AND e.job_id = j.job_id
AND e.department_id = d.department_id;
307
Lab 14.2: Análise de Plano
Execute o SQL abaixo e analise seu plano de execução.
SQL> CONN SHSB/SHSB
SQL> SELECT *
FROM
(SELECT times.calendar_quarter_desc,
customers.cust_first_name,
customers.cust_last_name,
customers.cust_id,
SUM(sales.amount_sold),
rank() over(PARTITION BY times.calendar_quarter_desc
ORDER BY SUM(amount_sold) DESC) AS
rank_within_quarter
FROM sales,
customers,
times
WHERE sales.cust_id = customers.cust_id
AND times.calendar_quarter_desc = '2002-2'
AND times.time_id = sales.time_id
GROUP BY customers.cust_id,
customers.cust_first_name,
customers.cust_last_name,
customers.cust_id,
times.calendar_quarter_desc)
WHERE rank_within_quarter < 16;
308
Lab 14.3: Análise de Plano
Execute o SQL abaixo e analise seu plano de execução.
SQL> CONN SHSB/SHSB
SQL> SELECT t.time_id,
to_char(SUM(amount_sold), '9,999,999,999') AS sales,
to_char(AVG(SUM(amount_sold)) over(ORDER BY t.time_id range BETWEEN INTERVAL '2'
DAY preceding AND INTERVAL '2' DAY following), '9,999,999,999') AS
centered_5_day_avg
FROM sales s,
times t
WHERE t.calendar_month_desc IN('1996-01','1996-02','1996-03','1996-04')
AND s.time_id = t.time_id
GROUP BY t.time_id
ORDER BY t.time_id;
310
Evolução de Slared SQL
- Bind Variable
- CURSOR_SHARING
- Bind Variable Peeking (9i)
- Extended Cursir Sharing / Adaptve Cursir Sharing (11gR1)
- Cardinality Feedback (11gR2)
- Adaptve Optmizer / Autimatc Reiptmizatin / Adaptve Plan (12cR1)
311
Estabilidade do Plano
●
HINTs (Sessiin: “_OPTIMIZER_IGNORE_HINTS” = TRUE)
●
Parâmetris de Cintrile di CBO
●
Parâmetris icultis de Cintrile di CBO
●
Stired Outlines
●
SQL Profles (DBA_SQL_PROFILES) (10g)
●
SQL Plan Baselines (11g)
●
SQL Plan Directves (12c)
313
Baselines
Consulta:
DBA_SQL_PLAN_BASELINES
314
Baselines
Evoluir Baselines:
SQL> SET LONG 10000
SQL> SELECT DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(sql_handle =>
'SYS_SQL_7b76323ad90440b9') FROM DUAL;
Remover Baselines:
SQL> DECLARE
i NATURAL;
BEGIN
i := DBMS_SPM.DROP_SQL_PLAN_BASELINE('SQL_0c20446867a16450');
DBMS_OUTPUT.PUT_LINE(i);
END;
/
315
Baselines
SQL> CONN / AS SYSDBA
SQL> ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE;
SQL> ALTER SYSTEM SET OPTIMIZER_USE_SQL_PLAN_BASELINES=TRUE;
316
Perguntas?