35
IEC Banco de Dados I Aula 17 – Otimização Modelo Relacional Turmas: Sistemas de Informação Professora: André Luiz da Costa Carvalho E-mail: [email protected] Site: http://bdufam.wordpress.com

IEC Banco de Dados I Aula 17 – Otimização Modelo Relacional

Embed Size (px)

DESCRIPTION

IEC Banco de Dados I Aula 17 – Otimização Modelo Relacional. Turmas: Sistemas de Informação Professora: André Luiz da Costa Carvalho E-mail: [email protected] Site: http://bdufam.wordpress.com. Sumário. Introdução. - PowerPoint PPT Presentation

Citation preview

Page 1: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

IECBanco de Dados I

Aula 17 – Otimização Modelo Relacional

Turmas: Sistemas de Informação

Professora: André Luiz da Costa Carvalho

E-mail: [email protected]

Site: http://bdufam.wordpress.com

Page 2: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Sumário

Técnicas de otimização de Esquema

Técnicas de otimização de Consultas

Page 3: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Introdução

O primeiro lugar onde podemos fazer Bancos de Dados melhores é na criação das tabelas (relações)

Com a aplicação rodando, mudar tableas pode levar à alterações em todos os programas que a usam

Importante acertar na primeira tentativa.

Page 4: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Alguns esquemas são melhores que outros Vejamos estes dois esquemas para informações

de pedidos feitos para compra de materiais: Fornece1(ID_forn,ID_mat,qtde,end_forn)

Fornece2(ID_forn,ID_part,qtde)Fornecedor(ID_forn,end_forn)

Vamos comparar estes dois esquemas no seguinte cenário: 100000 compras 2000 fornecedores Inteiros de 8 bytes e end_forn de 50 bytes.

Page 5: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

1 - Espaço

Segundo esquema usa espaço extra para o ID_forn redundante. 2000 x 8 = 16 mil bytes

Contudo, economiza nos endereços 2000 endereços vs 100000 do primeiro. 98000 x 50 = 4.950.000 bytes a menos Total 4.934.000 bytes a menos para o

segundo Só 5 megas?

Sim, mas ganho se manteria mesmo se aumentássemos para 1 bilhão de linhas

Page 6: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

2 – Preservação da Informação Imaginem que um fornecedor X entregou

todos os pedidos pendentes. Faz sentido que as linhas pertinentes a

ele sejam deletadas. Dessa forma, no esquema 1, a

informação de endereço de X seria perdida junto.

Então 1 é sempre pior? Nem sempre

Page 7: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

3 - Performance

Se você tem uma necessidade constante de saber o endereço do fornecedor de um dados pedido/peça, ele pode ser melhor. Especialmente se houverem poucas

inserções. Se houverem novas inserções

constantes, o endereço extra em cada pedido vai ser trabalho extra. Então, cada esquema pode ser útil

dependendo do caso.

Page 8: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Normalização

Esquema 1 é não normalizado, enquanto o esquema 2 é normalizado.

Dependência funcional X são atributos de R, A é um atributo específico

de R X -> A

X determina A Se duas instâncias diferentes tem o mesmo valor de X,

elas terão o mesmo valor para A Isto é mais interessante se A não é um atributo de X

Como assim? Cada fornecedor tem um endereço

Cada ID_forn determina o endereço

Page 9: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Particionamento Vertical

Banco: numCli, saldo e endereco Dependências: numCli->endereco e

numCli->saldo Duas formas de fazer o esquema

respeitando as dependências (numCli, endereco, saldo) (numCli, endereco)

(numCli,saldo) Qual é melhor?

Depende das consultas!

Page 10: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Banco

Endereço é usado geralmente uma vez por mês. Para mandar contas.

Saldo, em contrapartida é usado o tempo todo

Tabela (numCli,saldo) seria menor, o que traria benefícios Índices de cluster esparsos podem ser

menores. Mais pares numCli,saldo caberão na

memória Consulta que precisar ler todos saldos leria

menos blocos

Page 11: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

11

Perfomance

R (X,Y,Z) X inteiro YZ são strings

Consulta de Scan Particionamento Vertical ruim quando todos

atributos são acessados. Melhora quando só dois são acessados.

0

0.005

0.01

0.015

0.02

No Partitioning -XYZ

VerticalPartitioning - XYZ

No Partitioning -XY

VerticalPartitioning - XY

Th

rou

gp

ut

(qu

erie

s/se

c)

Page 12: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Cenário 2

numCli, endereco, cep, saldo Este esquema faz sentido?

(numCli,endereco) (numCli,cep) (numCli,saldo)

Separar CEP e endereço não parece uma boa idéia, já que eles devem ser sempre acessados junto.

Quando particionar: Acessos costumam ser em um dos conjuntos

de atributos, nunca entre atributos de ambos. Atributos Y e Z são grandes (1/3 do tamanho

de um bloco)

Page 13: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Desnormalização

As vezes, pode ser interessante ter uma informação não relacionada diretamente em uma relação, se houverem muitas consultas que projetem esta informação. Ou seja, se tiver que fazer vários joins para

acessar a informação. Joins são caros.

Pode valer a pena ter informação duplicada para agilizar.

Page 14: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

14

Desnormalização

Consulta: encontrar itens cujo fornecedor fica na Europa.

Normalizado precisa de 4 joins Desnormalizado: adiciona nome daregião ao item

(foreign key denormalization) Performance melhora 30%

0

0.0005

0.001

0.0015

0.002

normalized denormalized

Th

rou

gh

pu

t (Q

uer

ies/

sec)

Page 15: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Manutenção de agregação

Consultas com SUM, AVERAGE e afins podem ser muito caras.

Pode valer a pena guardar visões materializadas destas consultas. Espaço extra será usado. Cada insert gerará custos extras de

atualização da visão. Vale a pena se houverem mais consultas

que inserções. Pode-se criar tabelas redundantes com

gatilhos também.

Page 16: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Manutenção de agregação

Page 17: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Domínios dos atrinutos

Sempre prefira Integer a Float se possível. Float força range queries. Ex: Select nota from aluno where nota = 5

viraSelect nota from aluno where nota >=4.999 and nota <=5.001

Atributos que variam de tamanho: Use tipos variáveis. Varchar melhor que char se tamanho do

texto variar muito. Porém updates podem causar

fragmentação se valor novo não couber no bloco

Page 18: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Otimização de Consultas

Page 19: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

Otimização de Consultas

Sempre começe a otimização pelo que pode ser 100% benéfico. Criar índices, mudar o esquema, criar

visões, podem gerar custos novos. Reescrever consultas para ser mais rápidas

só traz benefícios

Page 20: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

20

Base de exemplo

funcionario(cpf, nome, dept, salario, numamigos);

estudante(cpf, nome, curso, periodo);

dept(dept, gerente, localizacao);

clustered index i1 on funcionario (cpf);

nonclustered index i2 on funcionario (nome);

nonclustered index i3 on funcionario (dept);

clustered index i4 on estudante (cpf);

nonclustered index i5 on estudante (nome);

clustered index i6 on dept (dept); 100000 tuplas funcionario, 100000 estudante, 10

departments; Cold buffer

Page 21: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

21

Elimine DISTINCTs desnecessários Query: Encontrar empregados do

departamento “ti”. Sem duplicatas.SELECT distinct cpfFROM funcionarioWHERE dept = ‘ti’

DISTINCT desnecessário, já que cpf é chave de funcionario

Page 22: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

22

Elimine DISTINCTs desnecessários Query: Encontrar cpf dos funcionarios de

algum departamento sem duplicatas.SELECT DISTINCT ssnumFROM employee, techWHERE employee.dept = tech.dept

Distinct necessário?

Page 23: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

23

DISTINCT desnecessário

Como dept é chave de dept, cada funcionário vai casar com um único registro de dept.

Cpf é chave do funcionário, então será 1 para um, sem precisar de distinct.

Page 24: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

24

Generalizando

Relacionamento entre DISTINCT, chaves e joins pode ser generalizado: Uma tabela T é chamada de privilegiada se os

campos retornados pelo select contém uma chave de T

Dado R, uma tabela não privilegiada. Se R é joinada através de uma chave a outra tabela S, diz se que R alcança S (reaches).

Alcance é transitivo. Se R1 alcança R2 e R2 alcança R3, então R1 alcança R3.

Page 25: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

25

Reaches: Teorema

Não haverão duplicatas, mesmo sem distinct, se uma das duas condições for válida: Toda tabela no FROM é privilegiada Toda tabela não-privilegiada alcança ao

menos uma tabela privilegiada.

Page 26: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

26

Reaches

Se toda relação é privilegiada então não haverão duplicatas Chaves da relação estão no from.

Dada uma relação T que não é privilegiada mas alcança ao menos uma relação privilegiada R. O Link entre T e R garante que cada

combinação de registros privilegiados é juntada com pelo menos um registro de T.

Page 27: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

27

Reaches: Exemplo 1

O mesmo funcionário pode casar com vários deptos (gerente não é chave), então cpf pode aparecer várias vezes.

Dept não alcança a a relação privilegiada funcionário.

SELECT funcionario.cpfFROM funcionario, dept

WHERE funcionario.gerente = dept.gerente

Page 28: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

28

Reaches: Exemplo 2

Cada valor de cpf seria acompanhado de um valor de departamento diferente, já que dept.nome é chave de dept.

Ambas relações são privilegiadas.

SELECT cpf, dept.nomeFROM funcionario, dept

WHERE funcionario.gerente = dept.gerente

Page 29: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

29

Reaches: Exemplo 3

Estudante é privilegiado Funcionário não alcança estudante (Nome

não é chave) DISTINCT é necessário.

Só em caso de nomes repetidos.

SELECT estudante.cpfFROM estudante, funcionario, dept

WHERE estudente.nome = funcionario.nome AND funcionario.dept = dept.nome;

Page 30: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

30

Queries – Subconsultas correlacionadas

Original:select cpffrom funcionario e1 where salario = (select max(salario) from funcionario e2 where e2.dept = e1.dept);

Reescrita:select max(salario) as maiorsalario, deptinto TEMP from funcionario group by dept;

Select cpffrom funcionario, TEMPwhere salario = maiorsalarioand funcionario.dept = temp.dept;

Page 31: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

31

Subconsultas relacionadas

SQL Server 2000 vai bem (usa hashjoin ao invés de repetição aninhada)

-10

0

10

20

30

40

50

60

70

80

correlated subquery

Th

rou

gh

pu

t im

pro

vem

ent p

erce

nt

SQLServer 2000

Oracle 8i

DB2 V7.1

> 10000> 1000

Page 32: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

32

Manutenção de Agregação

pedidos( numPedido, itemnum, qtde, idloja, idvend);

create clustered index i_pedr on pedidos(itemnum);

store( idloja, nome);

item(itemnum, preco);

create clustered index i_item on item(itemnum);

vendOtimo( idvend, total);

lojaOtimo( idloja, total);

1000000 pedidos, 10000 lojas, 400000 items; Cold buffer

Page 33: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

33

Manutenção de Agregação -- triggersTriggers para Manutenção de Agregação

create trigger atualizaVendOtimo on pedidos for insert as

update vendOtimo

set qtde =

(select vendOtimo.total+sum(inserted.qtde*item.preco)

from inserted,item

where inserted.itemnum = item.itemnum

)

Where idvend = (select idvend from inserted) ;

create trigger atualizaLojaOtimo on pedidos for insert as

update lojaOtimo

set qtde =

(select lojaOtimo.total+sum(inserted.qtde*item.preco)

from inserted,item

where inserted.itemnum = item.itemnum

)

where idloja = (select idloja from inserted)

Page 34: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

34

Aggregate Maintenance -- transações

Inserçõesinsert into pedidos values (1000350,7825,562,'xxxxxx6944',’jose');

Consultas (sem e com tabelas redundantes)select pedidos.vendid, sum(pedidos.qtde*item.preco)

from pedidos,item

where pedidos.itemnum = item.itemnum

group by pedidos.vendid;

vs. select * from vendOtimo;

select loja.nome, sum(pedidos.qtdey*item.preco)

from pedidos,item, loja

where pedidos.itemnum = item.itemnum and pedidos.idloja = loja.idloja

group by loja.idloja;

vs. select * from lojaOtimo;

Page 35: IEC Banco de Dados  I Aula 17  – Otimização Modelo Relacional

35

Manutenção de integração

Gatilhos para manutenção Se tem muitas consultas e poucas

inserções, então vale a pena.pect. of gain with aggregate maintenance

21900

31900

- 62.2-5000

0

5000

10000

15000

20000

25000

30000

35000

insert vendor total store total