quinta-feira, 31 de dezembro de 2015

O meu ano de 2015 na comunidade Oracle

Olá pessoal,

Segue um resumo do meu ano de 2015 na comunidade Oracle.

  • Eventos em que participei:
                Fevereiro: RMOUG Training Days - 2015

                Abril: Collaborate 15

                Junho: KSCOPE 15

                Agosto: OTN TOUR LA 2015 - Uruguai, Argentina, Brasil e Chile

                Outubro:  Oracle Ace Briefing 2015
                            Oracle Open World 2015

                Novembro: GUORS - 2015
                              ORAMEX- TECHDAY - 2015


  •  6 Artigos Publicados no GPO
01/02/2015

24/05/2015

31/05/2015

07/06/2015

11/10/2015
11/12/2015 
Foreign Keys não Indexadas


  • 14 artigos publicados no OTN e em 2 idiomas:

Criando PDBs no Oracle Database 12c - Parte 1 
Criando PDBs no Oracle Database 12c utilizando o DBCA - Parte 2
Criando PDBs no Oracle Database 12c utilizando o SQL Developer - Parte 3
Criando PDBs no Oracle Database 12c utilizando o EM Express - Parte 4
Criando PDBs no Oracle Database 12c utilizando o Enterprise Manager Total Cloud Control 12c - Parte 5
Oracle Database 12.1.0.2: Introdução ao Full Database Caching
Information Lifecycle Management (ILM) e Automatic Data Optimization (ADO)
Oracle Exadata Database Machine: I/O Resource Manager (IORM)
Criação de um relatório simples utilizando o Information Publisher Report
Migração para a versão 12c do Banco de Dados sem Downtime, utilizando Oracle Golden GateOracle
Database 12c: Uma introdução aos conceitos de backup, recuperação e de recuperação a um ponto no tempo (PITR) de PDBs
Oracle Exadata Database Machine: Exadata Hybrid Columnar Compression (EHCC)
ADRCI - Automatic Diagnostic Repository Command Interpreter 
Consejos y trucos: Crear pequeñas copias de una base de datos de producción



  •  Vídeos:









Espero que em 2016 consiga manter esse mesmo empenho e ajudar a comunidade Oracle o máximo possível!

Gostaria de agradecer ao Oracle ACE Program e ao Oracle OTN pelas oportunidades.

  • Evento já programado para 2016:
               RMOUG Training Days

Um bom 2016.
Alex Zaballa

Foreign Keys não Indexadas

Por padrão, o Oracle não cria índices nas colunas de Foreign Keys e isto pode acarretar em problemas de desempenho e até mesmo deadlocks.

Um exemplo disso, é a atualização de registros na tabela pai, onde o Oracle precisa verificar os registros filhos. Caso não exista um índice, é necessário fazer um full table scan e algumas vezes até mesmo um lock na tabela. Não é muito comum atualizar uma Primary Key, mas isso também se aplica no caso de realizar um delete no registro pai.

Os índices nas Foreing Keys também ajudam as queries no relacionamento pai/filho.

O sintoma mais comum deste problema, é encontrar o wait event: “enq: TM - contention”.

Então deve-se criar índices para todas as Foreign Keys?

A resposta é não, como o Tom Kyte explica no livro Expert Oracle Database Architecture, existem casos em que não é necessário:



Abaixo, um script para encontrar as Foreign Keys não Indexadas:

-- based on "Oracle Database Transactions and Locking Revealed" book by Thomas Kyte
WITH
ref_int_constraints AS (
SELECT /*+ MATERIALIZE NO_MERGE */
col.owner,
col.table_name,
col.constraint_name,
con.status,
con.r_owner,
con.r_constraint_name,
COUNT(*) col_cnt,
MAX(CASE col.position WHEN 01 THEN col.column_name END) col_01,
MAX(CASE col.position WHEN 02 THEN col.column_name END) col_02,
MAX(CASE col.position WHEN 03 THEN col.column_name END) col_03,
MAX(CASE col.position WHEN 04 THEN col.column_name END) col_04,
MAX(CASE col.position WHEN 05 THEN col.column_name END) col_05,
MAX(CASE col.position WHEN 06 THEN col.column_name END) col_06,
MAX(CASE col.position WHEN 07 THEN col.column_name END) col_07,
MAX(CASE col.position WHEN 08 THEN col.column_name END) col_08,
MAX(CASE col.position WHEN 09 THEN col.column_name END) col_09,
MAX(CASE col.position WHEN 10 THEN col.column_name END) col_10,
MAX(CASE col.position WHEN 11 THEN col.column_name END) col_11,
MAX(CASE col.position WHEN 12 THEN col.column_name END) col_12,
MAX(CASE col.position WHEN 13 THEN col.column_name END) col_13,
MAX(CASE col.position WHEN 14 THEN col.column_name END) col_14,
MAX(CASE col.position WHEN 15 THEN col.column_name END) col_15,
MAX(CASE col.position WHEN 16 THEN col.column_name END) col_16,
par.owner parent_owner,
par.table_name parent_table_name,
par.constraint_name parent_constraint_name
FROM dba_constraints con,
dba_cons_columns col,
dba_constraints par
WHERE con.constraint_type = 'R'
AND con.owner NOT IN ('ANONYMOUS','APEX_030200','APEX_040000','APEX_SSO','APPQOSSYS','CTXSYS','DBSNMP','DIP','EXFSYS','FLOWS_FILES','MDSYS','OLAPSYS','ORACLE_OCM','ORDDATA','ORDPLUGINS','ORDSYS','OUTLN','OWBSYS')
AND con.owner NOT IN ('SI_INFORMTN_SCHEMA','SQLTXADMIN','SQLTXPLAIN','SYS','SYSMAN','SYSTEM','TRCANLZR','WMSYS','XDB','XS$NULL','PERFSTAT','STDBYPERF')
AND col.owner = con.owner
AND col.constraint_name = con.constraint_name
AND col.table_name = con.table_name
AND par.owner(+) = con.r_owner
AND par.constraint_name(+) = con.r_constraint_name
GROUP BY
col.owner,
col.constraint_name,
col.table_name,
con.status,
con.r_owner,
con.r_constraint_name,
par.owner,
par.constraint_name,
par.table_name
),
ref_int_indexes AS (
SELECT /*+ MATERIALIZE NO_MERGE */
r.owner,
r.constraint_name,
c.table_owner,
c.table_name,
c.index_owner,
c.index_name,
r.col_cnt
FROM ref_int_constraints r,
dba_ind_columns c,
dba_indexes i
WHERE c.table_owner = r.owner
AND c.table_name = r.table_name
AND c.column_position <= r.col_cnt
AND c.column_name IN (r.col_01, r.col_02, r.col_03, r.col_04, r.col_05, r.col_06, r.col_07, r.col_08,
r.col_09, r.col_10, r.col_11, r.col_12, r.col_13, r.col_14, r.col_15, r.col_16)
AND i.owner = c.index_owner
AND i.index_name = c.index_name
AND i.table_owner = c.table_owner
AND i.table_name = c.table_name
AND i.index_type != 'BITMAP'
GROUP BY
r.owner,
r.constraint_name,
c.table_owner,
c.table_name,
c.index_owner,
c.index_name,
r.col_cnt
HAVING COUNT(*) = r.col_cnt
)
SELECT /*+ NO_MERGE */
*
FROM ref_int_constraints c
WHERE NOT EXISTS (
SELECT NULL
FROM ref_int_indexes i
WHERE i.owner = c.owner
AND i.constraint_name = c.constraint_name
)
ORDER BY
1, 2, 3;

Este script foi retirado do EDB360.


Referências:




Abraço,

Alex Zaballa.