Você está na página 1de 47

Capítulo 2

Optimização do desempenho

Sistemas de Bases de Dados


Engenharia Informática
ESTG - IPLeiria
2020/21

© Olga Craveiro, Catarina Silva


Cap.2 – Optimização do desempenho

Estrutura do capítulo

Introdução
Restrições de integridade
Indexação
Optimização de consultas SQL

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 2
Cap.2 – Optimização do desempenho

Introdução
De que depende o desempenho

Carga de trabalho
Throughput
Recursos
Optimização
Contenção

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 3
Cap.2 – Optimização do desempenho

Introdução
Definição de desempenho
optimização dos recursos para aumentar o
throughput e minimizar a contenção,
permitindo a realização da maior carga de
trabalho possível

dependente do objectivo da base de dados


Online Transaction Processing (OLTP)
Online Analytical Processing (OLAP)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 4
Cap.2 – Optimização do desempenho

Introdução
Melhorar o desempenho
Príncipio de Pareto - regra 80/20
80% dos resultados são obtidos com 20% do
esforço

Procurar os maiores focos de ineficiência:


Código SQL ineficiente
Código aplicacional ineficiente
Alocação de memória
Opções de log

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 5
Cap.2 – Optimização do desempenho

Introdução
Monitorização vs. Gestão

Identificar
problemas

FIND IT
Determinar
soluções
ANALYZE IT

Optimizar
ambiente
Monitorizar
FIX IT

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 6
Cap.2 – Optimização do desempenho

Introdução
Reativo vs. Proativo

Gestão reativa do desempenho será


sempre necessária
Gestão proativa
inclui
Antecipar
Planear
Automatizar
de forma a minimizar monitorização reativa,
reduzindo tempo, esforço e erro humano

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 7
Cap.2 – Optimização do desempenho

Introdução
Desempenho no desenvolvimento
Custo de alteração

Fase do desenvolvimento do sistema

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 8
Cap.2 – Optimização do desempenho

Introdução
Tipos de Optimização
Sistema (DBMS): memória, disco,
recursos, configurações, S.O., software de
rede,…
Base de dados: desenho físico,
normalização, armazenamento, nº tabelas,
índices definidos, parâmetros,…
Aplicação: código SQL, ineficiência de
outras linguagens (java, C++, Cobol)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 9
Cap.2 – Optimização do desempenho

Restrições de integridade
Tipos de restrições

Restrições de Integridade Declarativas


Tipos de validação
Ativação/Desativação e Eliminação

Triggers
Ativação/Desativação e Eliminação

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 10
Cap.2 – Optimização do desempenho

Restrições de integridade
Restrições declarativas (1)
Tipos de validação

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 11
Cap.2 – Optimização do desempenho

Restrições de integridade
Restrições declarativas (2)
Tipos de validação
Não Adiável
Adiável (deferrable)
Inicialmente imediatas
Inicialmente adiadas (p.ex. entrada de dados em
tabelas com chaves estrangeiras)

(...) CONSTRAINT nome_restrição


{ PRIMARY KEY (coluna, ...) [USING INDEX cláusula_indice]
| UNIQUE (coluna, ...) [USING INDEX cláusula_indice]
| FOREIGN KEY (coluna, ...) REFERENCES [schema.]nome_tabela (coluna,
...) [ON DELETE CASCADE]| CHECK (condição)}
[NOT DEFERRABLE | DEFERRABLE [INITIALLY {IMMEDIATE|DEFERRED}](...);

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 12
Cap.2 – Optimização do desempenho

Restrições de integridade
Restrições declarativas (3)
Ativar/Desativar

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 13
Cap.2 – Optimização do desempenho

Restrições de integridade
Restrições declarativas (4)
Ativar
ALTER TABLE tabela {ENABLE [VALIDATE | NOVALIDATE] }
{CONSTRAINT restrição | PRIMARY KEY | UNIQUE (coluna(s))}
[USING INDEX cláusula_índice]
[EXCEPTIONS INTO[schema.nome_tabela]];

Desativar
ALTER TABLE tabela DISABLE
{CONSTRAINT restrição|PRIMARY KEY|UNIQUE(coluna(s))}[CASCADE];

Eliminar

ALTER TABLE tabela DROP


{CONSTRAINT restrição|PRIMARY KEY|UNIQUE(coluna(s))}[CASCADE];

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 14
Cap.2 – Optimização do desempenho

Restrições de integridade
Restrições declarativas - exemplo

CREATE TABLE scott.employees(


empno NUMBER(4)
CONSTRAINT emp_pk PRIMARY KEY DEFERRABLE,
last_name VARCHAR2(30)
CONSTRAINT emp_ln_nn NOT NULL,
deptno NUMBER(2))
TABLESPACE data01;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 15
Cap.2 – Optimização do desempenho

Restrições de integridade
Triggers
Ativar
ALTER TRIGGER [schema.]nome_trigger ENABLE;
ALTER TABLE [schema.]nome_tabela ENABLE ALL TRIGGERS;

Desativar

ALTER TRIGGER [schema.]nome_trigger DISABLE;


ALTER TABLE [schema.]nome_tabela DISABLE ALL TRIGGERS;

Eliminar

DROP TRIGGER [schema.]nome_trigger;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 16
Cap.2 – Optimização do desempenho

Restrições de integridade
Triggers - exemplo

CREATE TRIGGER scott.emp_conv_ln


BEFORE INSERT OR UPDATE OF last_name ON scott.employees
FOR EACH ROW
BEGIN
:NEW.last_name:=INITCAP(:NEW.last_name);
END;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 17
Cap.2 – Optimização do desempenho

Indexação
Definição
Estrutura em árvore que permite o acesso direto mais
rápido a, pelo menos, uma coluna de uma tabela
Aceleram o acesso aos dados
Podem garantir a unicidade dos dados
Independentes (lógica e fisicamente) dos dados da
tabela a que estão associados
Sofrem alterações automáticas sempre que há
inserção, atualização e/ou eliminação de dados na
tabela a que se encontram associados
Pioram o desempenho em comandos DML

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 18
Cap.2 – Optimização do desempenho

Indexação
Implementação (1)
Uma das melhores técnicas para conseguir obter um
bom desempenho da BD

Consiste na criação dos índices apropriados para a BD


Quantos índices criar?
Como definir cada índice?

Método a utilizar em tabelas


Grandes
Onde as pesquisas são muito específicas
Consultas que acedam a <= 25% das linhas da tabela
Essencialmente estáticas

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 19
Cap.2 – Optimização do desempenho

Indexação
Implementação (2)
Uma tabela pode ter vários índices
Que colunas indexar?
muito acedidas, especialmente com WHERE (SQL)
com muitos valores nulos, mas os valores não nulos são
acedidos pela maioria das pesquisas
FOREIGN KEYS
PRIMARY KEYS
CANDIDATE KEYS
JOINs, ORDER BY, GROUP BY, UNION e DISTINCT
onde a maioria dos valores são distintos
com uma gama de valores vasta
Colunas do tipo LONG e LONG RAW não são indexáveis!

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 20
Cap.2 – Optimização do desempenho

Indexação
Implementação (3)
Minimizar o n.º de índices
(consultas versus operações DML)
Ordem de indexação de colunas
Colocar primeiro as colunas usadas com mais frequência

Exemplo
Várias consultas utilizam TIPO_PRODUTO
Poucas consultas utilizam TIPO_PRODUTO e
COR_PRODUTO

Criar um índice com a combinação (TIPO_PRODUTO,


COR_PRODUTO)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 21
Cap.2 – Optimização do desempenho

Indexação
Custo
Overhead na atualização no índice sempre que ocorrem
inserções, atualizações e eliminações de linhas na tabela
Espaço adicional ao armazenamento dos índices
pior cenário: índices a ocupar mais espaço que os dados da
tabela

Operações de carregamento de dados e reorganização de


tabelas vão demorar muito mais tempo
A BD terá ficheiros adicionais para o seu armazenamento
Poderá provocar problemas no S.O. (n.º máx. de ficheiros
abertos)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 22
Cap.2 – Optimização do desempenho

Indexação
Classificação
Lógica
Simples ou composto
Único ou duplicado

Física
Particionado ou não-particionado
B-tree [reverse key] ou bitmap
Function-based
incluem colunas transformadas por uma função
incluem uma expressão (ex:col1+col2)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 23
Cap.2 – Optimização do desempenho

Indexação
Índices b-tree
Estrutura
raiz
ramos
folhas
Formato das entradas de índices (folhas)
cabeçalho
Estado (lock ou unlock)
n.º de colunas
Dados (índices simples)
tamanho coluna (bytes)
valor coluna
ROWID das linhas que contêm determinado valor

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 24
Cap.2 – Optimização do desempenho

Indexação
Exemplo índice b-tree (1)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 25
Cap.2 – Optimização do desempenho

Indexação
Exemplo índice b-tree (2)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 26
Cap.2 – Optimização do desempenho

Indexação
Índices bitmap
Estrutura
Organizada como nos b-Tree

Formato das entradas de índices


cabeçalho
Estado (lock ou unlock)
n.º de colunas
Dados
tamanho coluna
valor coluna
ROWID inicial, ROWID final
Bitmap segment
string de bits

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 27
Cap.2 – Optimização do desempenho

Indexação
Exemplo índice bitmap

Índice Bitmap para atributo região

folhas
“Este” 101100 “Oeste” 010010 “Sul” 000001

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 28
Cap.2 – Optimização do desempenho

Indexação
Índices b-tree vs. bitmap

B-TREE BITMAP

Colunas de alta cardinalidade Colunas de baixa cardinalidade

Atualização de chaves têm um Atualização de chaves têm um custo


custo baixo muito elevado

Ineficiente para pesquisas com Eficiente para pesquisas com


operador OR operador OR

Utiliza-se em ambientes OLTP Utiliza-se em ambientes DSS


(tabelas dinâmicas) (tabelas estáticas de grande volume)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 29
Cap.2 – Optimização do desempenho

Indexação
Criação de índices (1)

Implícita
Restrições PRIMARY KEY e UNIQUE KEY
Explícita
Comando SQL para b-tree
CREATE [UNIQUE] INDEX [schema.]nome_indice
ON [schema.]nome_tabela
(coluna [ASC | DESC] [, ...] )
[TABLESPACE nome_tab]
[STORAGE cláusula_armazenamento]
[LOGGING | NOLOGGING] [NOSORT] ;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 30
Cap.2 – Optimização do desempenho

Indexação
Criação de índices (2)

Explícita
Comando SQL para bitmap

CREATE BITMAP INDEX [schema.]nome_indice


ON [schema.]nome_tabela
Colocar índices em
tablespaces separados (coluna [ASC | DESC] [, ...] )
[TABLESPACE nome_tab]
[STORAGE cláusula_armazenamento]
[LOGGING | NOLOGGING] Considerar NOLOGGING
na criação de índices grandes
[NOSORT] ;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 31
Cap.2 – Optimização do desempenho

Indexação
Exemplos de criação de índices (1)

CREATE INDEX IdxTCliente_Apelido


ON TCliente (Apelido) TABLESPACE indx01;

CREATE UNIQUE INDEX IdxTCliente_Email


ON TCliente (Email) TABLESPACE indx03;

CREATE BITMAP INDEX IdxTConselho_NomeConcelho


ON TConcelho (NomeConcelho) TABLESPACE indx02;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 32
Cap.2 – Optimização do desempenho

Indexação
Exemplos de criação de índices (2)

CREATE INDEX IdxUpperNome ON TCliente


(UPPER(Apelido));
SELECT * FROM TCliente
WHERE UPPER(Apelido) = ’SILVA’;

CREATE INDEX IdxExemplo ON Tab_X


(colA + colB * (colC - 1),colA, ColB );

SELECT colA FROM Tab_X


WHERE colA + colB * (colC – 1) < 100;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 33
Cap.2 – Optimização do desempenho

Indexação
Reconstrução de índices
Mover o índice para um tablespace diferente
Libertar espaço de memória das entradas eliminadas

ALTER INDEX [schema.]nome_indice REBUILD


[TABLESPACE nome_tab]
[STORAGE cláusula_armazenamento]
[LOGGING | NOLOGGING];

ALTER INDEX IdxTCliente_Apelido REBUILD


TABLESPACE indx04;

ALTER INDEX [schema.]nome_indice


DEALLOCATE UNUSED [KEEP integer];

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 34
Cap.2 – Optimização do desempenho

Indexação
Verificar validade de índices
Deteção de blocos corrompidos
Verificação do n.º de linhas eliminadas

ANALYZE INDEX [schema.]nome_indice


VALIDATE STRUCTURE;

ANALYZE INDEX IdxTCliente_Email


VALIDATE STRUCTURE;
SELECT blocks, lf_rows, del_lf_rows
FROM index_stats;

BLOCKS LF_ROWS DEL_LF_ROWS


Reorganizar quando
25 14 0
DEL_LF_ROWS/LF_ROWS>30%

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 35
Cap.2 – Optimização do desempenho

Indexação
Eliminação de índices
Antes do carregamento de dados na tabela
Quando não se obtém melhoria de velocidade
Quando não são utilizados
Quando se encontram inválidos

DROP INDEX [schema.]nome_index;

DROP INDEX IdxTCliente_Apelido;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 36
Cap.2 – Optimização do desempenho

Indexação
Informação no dicionário de dados
Vistas:
USER_INDEXES
USER_IND_COLUMNS
INDEX_STATS
USER_OBJECTS
USER_TABLESPACES
USER_SEGMENTS
USER_EXTENTS
DBA_INDEXES

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 37
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Introdução
Quando o SGBD Oracle recebe um comando SQL,
vai procurar a forma mais eficiente para o executar
Dois modos de funcionamento
Baseado em regras (RBO) (descontinuado)
Baseado em custos (CBO)
Em ambos os casos tenta encontrar a forma com
menos custo, ou baseado numa ordem de custo fixa
(regras) ou baseado em estatísticas (custos)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 38
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Regras fixas (15 no Oracle 8)
1.Single row by ROWID
(...)
4. Single row by unique or primary key
(…)
8. Composite-key
9. Single-column indexes
10. Bounded range search on indexed columns
11. Unbounded range search on indexed columns
(..)
14. ORDER BY on indexed columns
15. Full table scan

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 39
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Exemplo – Optimização por regras
select nome from socio
where data_insc > to_date('15-01-2000', 'DD-MM-YYYY')
and codigo=20
and sexo='F'

Considere que existe:


Índice b-tree em DATA_INSC
Chave primária em CODIGO
Índice b-tree em SEXO
Resultado
1 – DATA_INSC – unbounded search index (11)
2 – CODIGO – single row primary key (4)
3 – SEXO – single column index (9)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 40
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Plano de execução (1)
Cada comando SQL pode ser escrito de
várias formas e também pode ser
executado de formas diferentes
O plano de execução é guardado na tabela
PLAN_TABLE

EXPLAIN PLAN [SET statement_id='nome_comando']


[INTO [<esquema>.]<tabela>]
FOR <comando_sql>;

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 41
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Plano de execução (2)

Cada comando SQL pode ser escrito


de várias formas e também pode ser
executado de formas diferentes
EXPLAIN PLAN SET statement_id='JOIN37'
FOR
SELECT l.livro, s.nome
FROM livro l, socio s, requisicao r
WHERE l.codigo=r.codigo
AND s.codigo=r.cod_socio
AND s.sexo='F';

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 42
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Plano de execução - exemplo

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 43
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Redefinir comandos SQL (1)
Utilizar sempre que possível AND e = na definição das
condições
Evitar definir condições com manipulação das colunas
A utilização de funções impede a utilização de índices
associados às colunas manipuladas
Exemplos
WHERE a.NVenda = b.NVenda em vez de
WHERE TO_NUMBER(SUBSTR(a.order_no,INSTR(b.order_no,'.')-1))=
TO_NUMBER(SUBSTR(a.order_no,INSTR(b.order_no,'.')-1))

expString = expNumérica obriga a


TO_NUMBER(expString) = expNumérica

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 44
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Redefinir comandos SQL (2)
Evitar a utilização de um só comando para fazer
diferentes tarefas
Utilização de EXISTS versus IN nas subconsultas
Se a condição de restrição se encontra na subconsulta
usar IN
Se a condição de restrição se encontra na consulta
principal usar EXISTS

SELECT e.employee_id, e.first_name, e.last_name, e.salary


FROM employees e
WHERE EXISTS
(SELECT 1 FROM orders o
WHERE e.employee_id = o.sales_rep_id
AND o.customer_id =144);

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 45
Cap.2 – Optimização do desempenho

Optimização de consultas SQL


Redefinir comandos SQL (2)
Cautela na manipulação de vistas, principalmente
em vistas complexas

Não reciclar vistas


SELECT dname FROM v_emp_dept WHERE deptno = 10;
É preferível usar diretamente a tabela DEPT

Utilizar resultados intermédios


Armazenar temporariamente em tabelas

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 46
Cap.2 – Optimização do desempenho

Bibliografia
Oracle 8i – Curso completo, Luís Moreno Campos, FCA,
Parte VI, pág. 547-570 e Parte IX, pág. 707-733

Database Administration – The complete guide to


practice and procedures, Craig Mullins, Chapters 9-12

Oracle 11g:
https://docs.oracle.com/cd/E11882_01/server.112/e25
494/indexes.htm#ADMIN11710 (21 Managing indexes)

Oracle 19c:
https://docs.oracle.com/en/database/oracle/oracle-
database/19/admin/managing-indexes.html
(21 Managing indexes)

© Olga Craveiro, Catarina Silva Sistemas de Bases de Dados, ESTG- IPLeiria 2020/21 47

Você também pode gostar