RDBMS Tuning
Pedro da Silva
Indice
1. Schema Tuning


1.1. Vertical Partitioning
1.2. Tunnig Denormalization
2. Query Tuning


2.1. Query Monitoring
2.2. Query Rewriting
Schema Tunning - Introdução
Qual o melhor esquema?


Compra(keyFornecedor, keyPeça, quantidade,
moradaFornecedor)
Compra(keyFornecedor, keyPeça, quantidade)
Fornecedor(keyFornecedor, moradaFornecedor)
Resposta: DEPENDE

(Espaço? Informação? Performance?)
Vertical Partitioning
Contexto: Cada conta tem associada uma
morada e um saldo
Dois esquemas possíveis:


Conta(keyConta, morada, saldo)
Saldos(keyConta, saldo)
MoradasContas(keyConta, morada)
Se o saldo é acedido/actualizado muito
frequentemente então o segundo
esquema é melhor
Vertical Partitioning - Resumo
A Partição Vertical é
positiva se:

O acesso não se
dirige principalmente
aos dois atributos
SELECT morada, saldo
FROM conta
Througput (queries/sec)
0,02
0,015
0,01
0,005
0

Os dois atributos têm
valores muito
extensos
No Partitioning XYZ
Vertical
No Partitioning Partitioning - XYZ
XY
Vertical
Partitioning - XY
Partitioning vs No Portitioning
Vertical Partitioning - Resumo
1000
Throughput (queries/sec)
A Partição Vertical
melhora a
performance quando
a quantidade de
query’s a aceder
apenas a dois
atributos é maior que
20%
800
600
400
no vertical partitioning
vertical partitioning
200
0
0
20
40
60
% of access that only concern XY
80
100
Vertical Antipartitioning
É uma boa solução em casos onde é
sabido haver muitos mais acessos a uma
pequena parte dos registos associados
Contexto: Os 5 últimos movimentos são
mais importantes:

Conta(keyConta, saldo, morada, movimento1, movimento2, ... ,
movimento5)
Movimentos(keyConta, movimento)
Tuning Denormalization
Contexto: Cada conta pertence a um cliente, o
qual reside numa região

Conta(keyConta, saldo, ultimoMovimento, keyCliente)
Cliente(keyCliente, nome, keyRegião)
Região(keyRegião, região, clima)
Com o esquema anterior uma query para
mostrar as contas e a região das mesmas tornase pesada (3 JOINS)
Solução desnormalizada:

Conta(keyConta, saldo, ultimoMovimento, keyCliente, região)
Tuning Denormalization - Resumo
Desnormalização significa violar a
normalização do esquema para aumentar
a performance
Este método aumenta a performance
quando, muitas vezes, os atributos de
várias tabelas normalizadas são acedidos
conjuntamente
A performance é deteriorada quando
existem muitos updates
Query Monitoring
Duas formas de identificar uma query
lenta:

Acede a demasiada informação em disco
(uma query pontual que percorre toda a
tabela – table scan)
SELECT *
FROM Conta
WHERE bi = 12312456

O plano de execução (escolhido pelo
Optimizador) recorre a índices pouco
produtivos.
Query Rewriting - Índices
Muitos dos Optimizadores não usam índices
quando existem:

Expressões Aritméticas
(WHERE salario/12 >= 400)

Expressões com Substrings
(WHERE SUBSTR(nome, 1, 1) = ‘P’


Comparações numéricas entre atributos de tipos
diferentes
Comparações com NULL
Utilizar índices esparsos nas condições dos
JOINS é uma boa ideia.
Query Rewriting – DISTINCT’s
Eliminar DISTINCTS desnecessários

SELECT DISTINCT keyEmpregado
FROM Empregado
WHERE departamento = ‘Pesca‘
Generalizar a relação entre DISTINCTS, keys e
joins



Denominar uma tabela T privilegiada se o SELECT retorna
algum atributo chave de T
R é uma tabela não privilegiada. Denominar R alcança S se R
for unida (JOINED), por igualdade da sua chave, com a tabela S
Definir que alcança é transitivo (se R1 alcança R2 e R2 alcança
R3 então R1 alcança R3.
Query Rewriting – DISTINCT’s
Não haverão duplicados, mesmo sem o
DISTINCT, se uma das seguintes
condições se verificar:


Todas as tabelas mencionadas no FROM são
privilegiadas
Todas as tabelas não privilegiadas alcançam
pelo menos uma tabela privilegiada
DISTINCT - Exemplos
Exemplo 1:

SELECT numEmpregado
FROM Empregado, TecDpt
WHERE Empregado.keyDpt = TecDpt.keyDpt
Tabela Empregado é privilegiada
Tabela TecDpt alcança a tabela Empregado
Exemplo 2:



SELECT Estudante.bi
FROM Estudante, Empregado, TecDpt
WHERE Estudante.mome = Empregado.nome
AND Empregado.keyDpt = TecDpt.keyDpt
Estudante é privilegiada
Empregado não alcança Estudante (nome não é key)
DISTINCT é necessário para evitar duplicados
Abuse of Temporaries
Contexto: Encontrar todos os empregados e a sua
localização, do departamento de Informática com salário
superior a 40000€


INSERT INTO Temporaria
SELECT *
FROM Empregado
WHERE salario >= 40000
SELECT bi, localização
FROM Temporaria
WHERE Temporaria.departamento = ‘Informática’
A selecção deveria ter sido efectuada na ordem inversa
A tabela temporária “enganou” o Optimizador
Use of Views
A utilização de Views, só por si, não produz incremento
de performance


CREATE VIEW TecnicoLocalizacao
AS
SELECT bi, Tecnico.departamento, localização
FROM Empregado, Tecnico
WHERE Empregado.departamento = Tecnico.departamento
SELECT localização
FROM TecnicoLocalizacao
WHERE bi = 12312795
Os Optimizadores expandem as vistas quando são
identificados os blocos das querys para serem
Optimizados
Use of Views
A query à TecnicoLocalizacao é traduzida num
JOIN

SELECT localizacao
FROM Empregado, Tecnico
WHERE Empregado.departamento = Tecnico.departamento
AND bi = 12312795
Bibliografia
“Database Systems and Concepts”, Silbertchatz, Korth
and Sudarshan, 2005
http://www.distlab.dk/dbtune/
http://publib.boulder.ibm.com/infocenter/db2help/index.js
p?topic=/com.ibm.db2.udb.doc/admin/c0005282.htm
http://msdn.microsoft.com/library/default.asp?url=/library/
en-us/optimsql/odp_tun_1_3nxv.asp
Download

RDBMS Tuning