Aula 17 – Otimização Modelo Relacional

Slides:



Advertisements
Apresentações semelhantes
Tópicos em Banco de Dados
Advertisements

O Comando DROP INDEX Para eliminar um índice definido sobre uma tabela, utilize: Drop Index on ; Ex: No Access: Drop Index X on.
Estudo de Caso, modelo Oracle 10g
Banco de Dados Prof. Antonio.
Banco de Dados Prof. Antonio.
Banco de Dados I Aula 20.
Triggers Renata Viegas.
SQL Avançado Continuação
Banco de Dados SQL TRIGGERS (Gatilhos)
SISTEMAS DE INFORMAÇÃO Sistemas de Bancos de Dados 2º Semestre – 2010 Pedro Antonio Galvão Junior Fone:
Sistemas de Informação Redes de Computadores
Visões Marilde Santos.
Maurício Edgar Stivanello
Sistema Gerenciador de Banco de Dados SGBD
Daniel J. Abadi – Yale - New Haven, USA Samuel R. Madden – MIT – Cambrigde, USA Nabil Hachem – Avantgarde Consulting – Shrewbury, USA SIGMOD '08 Apresentado.
Introdução à Engenharia da Computação
Oficina sobre banco de dados
Operação de União “JOIN”
Modelo Entidade-Relacionamento
Linguagem de Banco de Dados - SQL
Banco de dados Profª Kelly Medeiros.
PostgreSQL.
Query Tuning Lílian Simão Oliveira.
SQL Server 2012 Introdução a Modelagem de Dados
Equipe de monitoria Aula prática 4.  Tipos  Tabela de Objetos  Herança  Métodos  Referências  Coleções  Composição de coleções  Conectividade.
BANCO DE DADOS UNIVERSIDADE ESTADUAL DE SANTA CRUZ
Design Patterns / Acesso ao banco de dados (java.sql)
Tipos de Linguagens do Banco de Dados
FTIN FORMAÇÃO TÉCNICA EM INFORMÁTICA Módulo de Programação Prof. Flávio Dantas.
Especialização em Tecnologia da Informação
III – Oracle10g Apontadores – Tipo de Dado (REF).
III – O Modelo OR Estudo de Caso, modelo Oracle 10g.
Desenvolvendo um script SQL
Linguagem SQL.
Rafael Lucio, Desenvolvedor Jr Padrão Informática e Assessor de TI Secretaria Municipal da Saúde;
VIEW - VISÕES Professor Esp. Diego André Sant’Ana
BANCOS DE DADOS ATIVOS Weyler M Lopes © Especialização em Banco de Dados.
Banco de dados.
Baseado no material do Professor Raul Paradeda
A abordagem de banco de dados para gerenciamento de dados
©Silberschatz, Korth and Sudarshan (modificado)4.1.1Database System Concepts Capítulo 4: SQL Estrutura básica Operações com conjuntos Funções de agregação.
Projeto de Sistemas de Informação Prof. Schneider Oracle Object-Relational.
SEGUNDA FASE / S2B MIC PERNAMBUCO
SQL- Structured Query Language  SQL é uma linguagem de comandos para interagir com uma BD relacional (não é case-sensitive).  A linguagem Java permite.
Triggers (Gatilhos) Professor Esp. Diego André Sant’Ana
SCC Bancos de Dados e Suas Aplicações
AULA DE DÚVIDAS 9 de Abril de Especialização  Simplifica-se quando:  especialização é disjunta e  especialização é total e  não há relações.
Banco de Dados I I Comandos SQL
Linguagem SQL Prof. Juliano.
III - Oracle9i Apontadores – Tipo de Dado (REF). Identificador de Objeto A todo objeto de uma “object table” é associado um OID (“Object IDentifier”)
Equipe de monitoria Aula prática 4.  Tipos  Tabela de Objetos  Herança  Métodos  Referências  Coleções  Composição de coleções  Conectividade.
IEC Banco de Dados I Aula 04 – SQL (II) Turmas: Sistemas de Informação Professora: André Luiz da Costa Carvalho
1 Introdução à Manipulação de Dados SQL – Structured Query Language  Tabela = Relação  DDL – Data Definition Language  Sub-conjunto do SQL que suporta.
RDBMS Tuning Pedro da Silva. Indice 1. Schema Tuning 1.1. Vertical Partitioning 1.1. Vertical Partitioning 1.2. Tunnig Denormalization 1.2. Tunnig Denormalization.
Professor Me. Jeferson Bussula Pinheiro.
Daniel Paulo Introdução Neste capítulo trataremos a relação entre tabelas e FILEGROUPS, bem como a alocação interna de dados.
VBA – Visual Basic para Aplicativos
Plano de Ensino Conceitos e Características Tipos de Banco de Dados
Linguagem de definição de dados - SQL
BD SQL (Insert, Update, Delete) e Select Hayslan Nicolas Colicheski Bucarth – IFRO / 2015 –
Fundamentos de Banco de Dados Prof. André Cypriano M. Costa
Banco de Dados -Aprendendo conceitos -Usando o SQL Conf para:
INTELIGÊNCIA EMPRESARIAL Aula 9 - Modelagem de Data Warehouse.
1 Programação de Banco de Dados José Antônio da Cunha George Azevedo da Silva.
Banco de Dados II Prof: Márcio Soussa Curso de Sistemas de Informação Faculdades Jorge Amado.
José Antônio da Cunha IFRN Administração de Banco de Dados.
Prática de Banco de Dados Créditos: Prof. Jefferson Silva Adaptações: Prof. Nécio de Lima Veras.
Normalização (4FN) Na literatura aparecem outras formas normais, como a forma normal de Boyce/Codd, a 4FN e a 5FN. Destas a única que tem importância na.
Programação para Internet Aula 11 SQL (Introdução a linguagem, comandos de modificação: Create, Drop, Alter, Insert, Delete, Update)
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Capítulo 5 Mais SQL: Consultas Complexas, Triggers e Views.
Transcrição da apresentação:

Aula 17 – Otimização Modelo Relacional IEC Banco de Dados I Aula 17 – Otimização Modelo Relacional Turmas: Sistemas de Informação Professora: André Luiz da Costa Carvalho E-mail: andre@icomp.ufam.edu.br Site: http://bdufam.wordpress.com

Técnicas de otimização de Esquema Sumário Técnicas de otimização de Esquema Técnicas de otimização de Consultas

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.

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.

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

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

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.

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

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!

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

Perfomance R (X,Y,Z) Consulta de Scan 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.

Cenário 2 numCli, endereco, cep, saldo Este esquema faz sentido? (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)

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.

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%

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.

Manutenção de agregação

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 vira Select 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

Otimização de Consultas

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

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

Elimine DISTINCTs desnecessários Query: Encontrar empregados do departamento “ti”. Sem duplicatas. SELECT distinct cpf FROM funcionario WHERE dept = ‘ti’ DISTINCT desnecessário, já que cpf é chave de funcionario

Elimine DISTINCTs desnecessários Query: Encontrar cpf dos funcionarios de algum departamento sem duplicatas. SELECT DISTINCT ssnum FROM employee, tech WHERE employee.dept = tech.dept Distinct necessário?

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.

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.

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.

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.

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.cpf FROM funcionario, dept WHERE funcionario.gerente = dept.gerente

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.nome FROM funcionario, dept WHERE funcionario.gerente = dept.gerente

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.cpf FROM estudante, funcionario, dept WHERE estudente.nome = funcionario.nome AND funcionario.dept = dept.nome;

Queries – Subconsultas correlacionadas Original: select cpf from funcionario e1 where salario = (select max(salario) from funcionario e2 where e2.dept = e1.dept); Reescrita: select max(salario) as maiorsalario, dept into TEMP from funcionario group by dept; Select cpf from funcionario, TEMP where salario = maiorsalario and funcionario.dept = temp.dept;

Subconsultas relacionadas SQL Server 2000 vai bem (usa hashjoin ao invés de repetição aninhada) > 1000 > 10000

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

Manutenção de Agregação -- triggers Triggers 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 (select lojaOtimo.total+sum(inserted.qtde*item.preco) where idloja = (select idloja from inserted)

Aggregate Maintenance -- transações Inserções insert 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;

Manutenção de integração Gatilhos para manutenção Se tem muitas consultas e poucas inserções, então vale a pena.