Gediel Luchetta
Infra-Estrutura Oracle
Agenda
OPEN CLOSE
• Benefícios:
• Reduz o tempo de parse;
• Reduz consumo de cpu do server;
• Melhor uso da memória;
• Cache comandos SQL mesmo que esses estejam
dentro das aplicações.
1. Entender como um comando SQL é
processado
Processo de otimização:
• Verificando as estatísticas:
Índices:
• Índices são usados para agilizar o processo de
consulta ao banco de dados;
• Sua utilização tem custos:
– aumenta o tempo dos inserts, updates e deletes;
– Consumem espaço no banco de dados;
– As leituras sempre são feitas bloco a bloco;
• Devem ser muito bem planejados;
Ps: restrições tipo “is null” ou “is not null” nunca usam índices.
4. Métodos de acessos
Full Scans:
Tabela de clientes:
Nro de linhas : 1640
Nro de blocos : 40
Tamanho do bloco : 4k
Tamanho da tabela : 160K
Parametro do banco:
1 Bloco
DB_FILE_MULTIBLOCK_READ_COUNT = 8
4. Métodos de acessos
Pergunta:
Qual é o melhor método de acesso, Index
lookups ou Full Scans?
Resposta:
Depende......
5. Técnicas de Joins
• NESTED LOOP
• SORT MERGE JOIN
• HASH JOIN
5. Técnicas de Joins
NESTED LOOPS
TABLE ACCESS (...) OF outer_table
TABLE ACCESS (...) OF inner_table
NESTED LOOPS
TABLE ACCESS (BY ROWID) outer_table
INDEX (...SCAN) OF outer_table_index (...)
TABLE ACCESS (BY ROWID) inner_table
INDEX (...SCAN) OF inner_table_index (...)
5. Técnicas de Joins
• Hash join:
1. A menor tabela é usada para construção de uma
“hash table”;
2. A maior tabela é então acessada e comparada
com a “hash table”;
HASH JOIN
TABLE ACCESS (...) OF tableA
TABLE ACCESS (...) OF tableB
Pergunta:
Qual é o melhor tipo de Join, nested loops,
Sort Merge Join ou Hash Join?
Resposta:
Entre Hash Join e Sort Merge Join o
primeiro é preferível.
Entre Hash Join e Nested loops, depende...
6. Verificando e entendendo um plano de acesso
• Explain Plan:
Select Select
Insert Insert
/*+ HINT */ OU --+ HINT
Update Update
Delete Delete
7. Influenciando o Otimizador (Hints)
Bulk Binds
SQL Dinâmico nativo
Materialized Views
Function Based Index
Novos DMLs
Cláusula With
8. Funcionalidades de performance
Bulk Binds
• Redução do overhead pela redução da troca de contexto em
pl/sql e sql;
• Operação com múltiplas linhas em um único DML;
• Adição de novas palavras chaves: FORALL e BULK
COLLECT.
PL/SQL ENGINE
PROCEDURAL
BLOCK PROCEDURAL STATEMENT
PL/SQL EXECUTOR
SQL ENGINE D
A
T
A
SQL STATEMENT EXECUTOR
8. Funcionalidades de performance
Materialized Views:
– Utilizadas para armazenar dados pré-computados, agregados,
sumarizados etc;
– Aumentam a velocidade das querys em grandes bases;
– A atualização da materialized view é automática e transparente;
Exemplo:
create materialized view pedidos_clientes build immediate refresh
force enable query rewrite as
select c.cli_nome, sum(i.ite_qtd)
from pedidos p, itens_pedido i, clientes c
where c.cli_id = p.cli_id
and p.ped_id = i.ped_id
group by c.cli_nome;
8. Funcionalidades de performance
Novos DMLs:
Multi-Table-Inserts:
– Permite a inserção de dados em várias tabelas
em um único comando;
– Pode ser usando para transferir dados de
uma ou mais source tables para um conjunto
de outras tabelas;
– A performance melhora porque não há
necessidade de ler o source mais que uma
vez.
8. Funcionalidades de performance
Novos DMLs:
Multi-Table-Inserts (Incondicional):
INSERT ALL INTO product_activity VALUES(
today, product_id, quantity)
INTO product_sales VALUES(
today, product_id, total)
SELECT TRUNC(order_date) today, product_id,
SUM(unit_price) total, SUM(quantity),quantity
FROM orders, order_items
WHERE orders.order_id = order_items.order_id
AND order_date = TRUNC(SYSDATE)
GROUP BY TRUNC(order_date), product_id;
8. Funcionalidades de performance
Novos DMLs:
Multi-Table-Inserts (condicional):
INSERT ALL
WHEN product_id IN
(select product_id FROM promotional_items)
INTO promotional_sales
VALUES (product_id, list_price)
WHEN order_mode = 'online'
INTO web_orders
VALUES (product_id, order_total)
SELECT product_id, list_price, order_total,
order_mode FROM orders;
8. Funcionalidades de performance
Novos DMLs:
Multi-Table-Inserts (condicional - first):
INSERT FIRST
WHEN order_total> 10000 THEN
INTO priority_handling VALUES (id)
WHEN order_total > 5000 THEN
INTO special_handling VALUES (id)
WHEN order_total > 3000 THEN
INTO privilege_handling VALUES (id)
ELSE
INTO regular_handling VALUES (id)
SELECT order_total, order_id id FROM orders;
8. Funcionalidades de performance
Novos DMLs:
Comando merge: Realiza um update se a chave existir
senão realiza um insert.
Cláusula With:
Cláusula With:
• Abordagem tradicional:
SELECT department_name, SUM(salary) AS dept_total
FROM employees, departments
WHERE employees.department_id =
departments.department_id
GROUP BY department_name HAVING
SUM(salary) > (
SELECT SUM(salary) * 1/8
FROM employees, departments
WHERE employees.department_id =
departments.department_id)
ORDER BY sum(salary) DESC;
8. Funcionalidades de performance
Cláusula With:
• Cláusula With (exemplo) usando with:
WITH
summary AS (
SELECT department_name, SUM(salary) AS dept_total
FROM employees, departments
WHERE employees.department_id =
departments.department_id
GROUP BY department_name )
SELECT department_name, dept_total
FROM summary
WHERE dept_total > (
SELECT SUM(dept_total) * 1/8
FROM summary )
ORDER BY dept_total DESC;
9. Dicas práticas de otimização de sistemas
OLTPs
1) Só usar índice quando o número de linhas a ser pesquisado for baixo caso
contrário sempre preferir Full Scans;
2) Preferir “HASH JOINS” e não “NESTED LOOPS”;
3) Para deletes/updates de mais de 20% das linhas procurar fazer com CTAS
(create table as select);
4) Usar “Parallel Query” se tiver CPU e bom sistema de Disco;
5) Utilizar opção NOLOGGING p/ CTAS e criação de índices;
6) Evitar indexação de tabelas temporárias;
7) Quando um plano apresentar problemas conferir se as estatísticas estão
atualizadas;
8) Usar funções como DECODE ou CASE, para evitar acessos desnecessários;
9) Paralelizar a nível de aplicação quando não der a nível de banco;
10) Sempre que possível usar as features do 9i: Multi-table insert, merge, with, etc.