Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
Técnicas de Implementação
de Bancos de Dados
Governador
Cid Ferreira Gomes
Vice Governador
Francisco José Pinheiro
Secretária da Educação
Maria Izolda Cela de Arruda Coelho
Secretário Adjunto
Maurício Holanda Maia
Secretário Executivo
Antônio Idilvan de Lima Alencar
TÉCNICAS DE IMPLEMENTAÇÃO
DE BANCO DE DADOS
SUMÁRIO
No nível físico, um registro de cliente, conta ou empregado pode ser descrito como
um bloco consecutivo de memória. No nível lógico, cada registro é descrito por um tipo
definido, assim como é definida a inter-relação entre esses tipos de registros. Finalmente,
no nível de visão, os usuários do computador veem um conjunto de programas de aplicação
que escondem os detalhes dos tipos de dados.
CLASSIFICAÇÃO DOS SISTEMAS DE BANCO DE DADOS
São dados sobre outros dados. Um item de um metadado pode dizer do que se trata aquele dado, geralmente
uma informação inteligível por um computador. Os metadados facilitam o entendimento dos relacionamentos e a utilidade
das informações dos dados.
Além disso, algumas estruturas de dados são exigidas como parte da implementação
física do sistema:
Um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um
processo e o dispositivo de armazenamento ao qual esse operador acede.
ARMAZENAMENTO DE DADOS
TÉCNICAS RAID
RAID nível 0 (zero). Refere-se ao arranjo de disco com distribuição paralela baseada
em blocos, mas sem qualquer redundância, tal como espelhamento ou bits de paridade.
RAID nível 2. é similar ao RAID 4, mas armazena informação ECC (Error Correcting
Code), que é a informação de controle de erros, no lugar da paridade. Este fato possibilita
uma pequena proteção adicional, porém o RAID 2 ficou obsoleto pelas novas tecnologias de
disco já possuírem este tipo de correcção internamente. O RAID 2 origina uma maior
consistência dos dados se houver queda de energia durante a escrita. Baterias de segurança
e um encerramento correto podem oferecer os mesmos benefícios.
.
Raid nível 3. É uma versão simplificada do RAID nível 2. Nesse arranjo, um único bit
de paridade é computado para cada palavra de dados e escrito em um drive de paridade. À
primeira vista, pode parecer que um único bit de paridade dá somente detecção de erro, e
não correção de erro. Para o caso de erros aleatórios não detectados, essa observação é
verdadeira. Todavia, para o caso de uma falha de drive, ela provê correção total de erros de
um bit, uma vez que a posição do bit defeituoso é conhecida. Se um drive falhar, o
controlador apenas finge que todos os seus bits são "zeros". Se uma palavra apresentar erro
de paridade, o bit que vem do drive extinto deve ter sido um "um", portanto, é corrigido. A
fim de evitar o atraso em razão da latência rotacional, o RAID 3 exige que todos os eixos das
unidades de disco estejam sincronizados. A maioria das unidades de disco mais recentes não
possuem a opção de sincronização do eixo, ou se são capazes disto, faltam os conectores
necessários, cabos e documentação do fabricante.
Raid nível 4. Funciona com dois ou mais discos iguais. Um dos discos guarda a
paridade (uma forma de soma de segurança) da informação contida nos discos. Se algum
dos discos avariar, a paridade pode ser imediatamente utilizada para reconstituir o seu
conteúdo. Os discos restantes, usados para armazenar dados, são configurados para usarem
segmentos suficientemente grandes (tamanho medido em blocos) para acomodar um
registro inteiro. Isto permite leituras independentes da informação armazenada, fazendo do
RAID 4 um array perfeitamente ajustado para ambientes transacionais que requerem
muitas leituras pequenas e simultâneas.
Raid nível 1 + 0 (zero). O RAID 1+0, ou 10, exige ao menos 4 discos rígidos. Cada par
será espelhado, garantindo redundância, e os pares serão distribuídos, melhorando
desempenho. Até metade dos discos pode falhar simultaneamente, sem colocar o conjunto
a perder, desde que não falhem os dois discos de um espelho qualquer — razão pela qual
usam-se discos de lotes diferentes de cada ‘lado’ do espelho. É o nível recomendado para
bases de dados, por ser o mais seguro e dos mais velozes, assim como qualquer outro uso
onde a necessidade de economia não se sobreponha à segurança e desempenho.
Raid nível 50. É um arranjo híbrido que usa as técnicas de RAID com paridade em
conjunção com a segmentação de dados. Um arranjo RAID-50 é essencialmente um arranjo
com as informações segmentadas através de dois ou mais arranjos.
GERENCIAMENTO DE BUFFER
PROCESSAMENTO DE CONSULTAS
Seleção σ
Projeção π
Operações binárias
União ∪
Diferença -
Produto cartesiano X
Operações derivadas
Junção natural
Divisão ÷
Interseção ∩
Consulta C1
Nome dos empregados que não possuem dependentes
πnome_emp(empregado) - πnome_emp(empregado
dependente)
Consulta C2
select saldo
from conta
where saldo < 2500
πsaldo (σsaldo<2500(conta))
Consulta C3
Nome e salário dos empregados que ganham mais que 5000
Consulta C4
Nome e salário dos empregados que trabalham no departamento DC
πnome_emp, salário
σnome_dep = ‘DC’
EMPREGADO DEPARTAMENTO
Os diferentes planos de avaliação para uma determinada consulta podem ter custos
diferentes. Não se espera que os usuários escrevam suas consultas de uma maneira que
sugiram o plano de avaliação mais eficiente. Em vez disso, é responsabilidade do sistema
construir um plano de avaliação de consulta que minimize seu custo.
A otimização de consultas é o processo de selecionar o plano de avaliação de
consulta mais eficiente para uma consulta. Um aspecto da otimização acontece ao nível da
álgebra relacional. Faz-se uma tentativa de encontrar uma expressão que é equivalente à
expressão dada, tentando encontrar uma expressão mais eficiente para execução. Para
escolher entre diferentes planos de avaliação de consulta, o otimizador deve estimar o
custo de cada plano de avaliação. O cálculo do custo exato da avaliação de um plano
normalmente não seria possível sem executar o plano de fato. Em vez disso, os otimizadores
fazem uso de informações estatísticas sobre as relações, como os tamanhos das relações e
as profundidades dos índices, para realizar uma boa estimativa do custo de um plano.
Essas estatísticas incluem:
Número de tuplas na relação r.
Tamanho de um registro (tupla) da relação r em bytes.
Número de valores distintos que aparecem na relação r para um determinado
atributo.
Essas estatísticas nos permitem estimar os tamanhos dos resultados de várias
operações, como também o custo para executar as operações.
PROCESSAMENTO DE TRANSAÇÕES
forma begin transaction e end transaction. A transação consiste em todas as operações ali
executadas, entre o começo e o fim da transação.
Para assegurar a integridade dos dados, exigimos que o sistema de banco de dados
mantenha as seguintes propriedades das transações (ACID):
Atomicidade. Ou todas as operações da transação são refletidas
corretamente no bando de dados ou nenhuma o será.
Consistência. A execução de uma transação isolada (ou seja, sem a execução
concorrente de outra transação) preserva a consistência do banco de dados.
Isolamento. Embora diversas transações possam ser executadas de forma
concorrente, o sistema garante que, para todo par de transações Ti e Tj, Ti
tem a sensação de que Tj terminou sua execução antes de Ti começar, ou
que Tj começou sua execução após Ti terminar. Assim, cada transação não
toma conhecimento de outras transações concorrentes no sistema.
read (x), que transfere o item de dados X do banco de dados para um buffer
local alocado à transação que executou a operação de read.
write (x), que transfere o item de dados X do buffer local da transação que
executou a operação de write de volta ao banco de dados.
Como exemplo, seja Ti uma transação que transfere 50 reais da conta A para a conta
B:
Dizemos que uma transação foi efetivada somente se ela entrou no estado de
efetivação. Analogicamente, dizemos que uma transação abortou somente se ela entrou no
estado de abortada. Uma transação é dita concluída se estiver em efetivação ou abortada.
Os sistemas de processamento de transações, normalmente, permitem que diversas
transações sejam executadas de modo concorrente. Permitir que múltiplas transações
concorram na atualização de dados traz diversas complicações em relação à consistência
desses dados. Assegurar a consistência, apesar da execução concorrente de transações,
exige trabalho adicional; é muito mais fácil insistir na execução das transações
sequencialmente, uma de cada vez, cada uma começando somente depois que a anterior se
completou.
A motivação para usar a execução concorrente em um banco de dados é
essencialmente a mesma para usar multiprogramação em um sistema operacional. Quando
várias transações são processadas de modo concorrente, a consistência do banco de dados
pode ser destruída, mesmo que cada transação individual seja executada com correção. O
sistema de banco de dados deve controlar a interação entre as transações concorrentes
para impedi-las de destruir sua consistência. Isso é feito por meio de uma variedade de
mecanismos chamadas de esquemas de controle de concorrência (Schedule).
Para compreensão do estado concorrente da execução das transações, estudemos
alguns cenários com duas transações. A transação T1 transfere 50 reais da conta A para a
conta B. Já a transação T2 transfere 10 por cento do saldo da conta A para a conta B.
Sejam mil e dois mil reais os valores correntes das contas A e B, respectivamente.
Suponha que as duas transações sejam executadas em sequencia, T1 seguida de T2.
SERIALIZAÇÃO DE TRANSAÇÕES
Para tanto, partimos de uma premissa que a execução de uma transação é correta,
se executada isoladamente, produzindo sempre como saída um estado consistente do
banco de dados. De igual forma, garantimos o padrão de corretude dos schedules a partir do
seguinte teorema:
S = T1 T2 T3 ... Tn-1 Tn
Seja um schedule S. Se S produz um estado de banco de dados igual ao produzido
por alguma execução serial do mesmo conjunto de transações, então a execução S é
correta.
Para que possamos determinar a equivalência de schedules, devemos a partir de um
conjunto T = { T1, T2, ..., Tn } de transações, encontrar schedules cujas execuções produzam
o mesmo estado no banco de dados que a execução de algum schedule serial sobre o
conjunto T.
Existem 3 (três) tipos de equivalência de schedules:
Estado final
Visão
Conflito
transações, estes serão equivalentes de estado final (S ≈FS S’) se, e somente se:
O grande problema desta abordagem fica por conta dos schedules não guardarem os
conceitos de estados inicial e final.
Para cada operação ri(x) de Ti ∈ T, o valor lido por ri é o mesmo nos dois
schedules
Se wi(x) é a última operação de escrita sobre x em S, então wi(x) é a última
operação sobre x em S’
T1 = r1(x) w1(x)
T2 = r2(x) w2(y)
S = r2(x) r1(x) w2(y) w1(x)
T1=r1(y)r1(x)w1(y) T2=r2(x)r2(y)w2(x)
S=r1(y)r1(x)r2(x)w1(y)r2(y)w2(x)
S’=r1(y)r1(x)w1(y)r2(x)r2(y)w2(x)
S1 produz o mesmo estado final que SS, então S1 é serializável por estado final. S1 é
correto, embora não seja serializável por visão (o valor lido por r1(x) é diferente nos dois
schedules) e nem por conflito.
T1=r1(y)r1(x)w1(y)
T2=r2(x)r2(y)w2(x)
T3=r3(y)r3(x)w3(z)
S=r3(y)r1(y)r1(x)r2(x)w1(y)r2(y)r3(x)w2(x)w3(z)
SS=r3(y)r3(x)w3(z)r1(y)r1(x)w1(y)r2(x)r2(y)w2(x)
Veja o exemplo abaixo, para um determinado conjunto T = { T1, T2, T3 }.
S=r3(y)r1(y)r1(x)r2(x)w1(y)r2(y)r3(x)w2(x)w3(z)
CONTROLE DE CONCORRÊNCIA
Vimos que uma propriedade fundamental da transação é o isolamento.
Quando diversas transações são executadas de modo concorrente em um banco de dados, a
propriedade do isolamento pode não ser preservada. É necessário que o sistema controle a
interação entre transações concorrentes; esse controle é alcançado por meio de uma larga
gama de mecanismos chamados esquemas de controle de concorrência.
Todos os esquemas de controle de concorrência têm por base a propriedade
da serialização, isto é, todos os esquemas garantem que a ordenação de processamento é
serializada. Um meio para garantir a serialização é obrigar que o acesso aos itens de dados
seja feito de maneira mutuamente exclusiva, isto é, enquanto uma transação acessa um
item de dados, nenhuma outra transação pode modificá-lo. O método mais usado para sua
implementação é permitir o acesso a um item de dados somente se ele estiver bloqueado.
Há vários modos por meio dos quais um item de dado pode ser bloqueado, dentre eles:
Compartilhado. Se uma transação Ti obteve um bloqueio compartilhado
sobre o item Q, então Ti pode ler, mas não escrever Q.
Exclusivo. Se uma transação Ti obteve um bloqueio exclusivo do item Q,
então Ti pode tanto ler como escrever Q.
1. Não haja nenhuma outra transação com bloqueio sobre Q cujo modo de
bloqueio seja conflitante com M.
2. Não haja nenhuma outra transação que esteja esperando um bloqueio sobre Q e
que tenha feito sua solicitação de bloqueio antes de T1.
É uma sequência de caracteres, indicando a data e/ou tempo em que um determinado evento ocorreu.
Para ilustrar esses conceitos, considere o gráfico de espera abaixo, que exibe
a seguinte situação:
A transação T25 está esperando as transações T26 e T27.
A transação T27 está esperando a transação T26.
A transação T26 está esperando a transação T28.
Uma vez que não há ciclos, o sistema não está em estado de deadlock.
Suponha, agora, que a transação T28 esteja solicitando um item preso por T27. A aresta T28
T27 será adicionado ao gráfico de espera, alterando o estado do sistema, como mostrado
na figura abaixo.
A essa altura, o gráfico contém o ciclo: T26 T28 T27 T26, implicando
que as transações T26, T27 e T28 estão todas em deadlock.
2. Rollback. Uma vez decidido que uma transação em particular será revertida,
precisamos determinar até que ponto ela deverá ser revertida. Entretanto, é
mais eficaz reverter a transação somente o suficiente para a quebra do deadlock.
Mas esse método exige que o sistema mantenha informações adicionais sobre o
estado de todas as transações em execução.
TÉCNICAS DE RECUPERAÇÃO
Erro lógico. A transação não pode mais continuar com sua execução normal
devido a alguma condição interna, como uma entrada inadequada, um dado
não encontrado, overflow ou limite de recurso excedido.
Erro de sistema. O sistema entrou em um estado inadequado (deadlock),
com isso, uma transação não pode continuar com sua execução normal. A
transação, entretanto, pode ser reexecutada posteriormente.
seguintes:
Cada transação Ti tem uma área de trabalho privada na qual cópias de todos
os itens de dados acessados e atualizados são mantidas. Essa área de trabalho é criada
quando a transação é iniciada; ela é removida quando a transação é efetivada ou abortada.
Cada item de dados x mantido na área de trabalho da transação Ti é denotado por xi. A
transação Ti interage com o sistema de banco de dados pela transferência de dados para e
de sua área de trabalho até o buffer de sistema. Transferimos os dados usando as duas
operações a seguir:
1. read(X) designa o valor do item de dado X para a variável local xi. Essa operação
é executada como segue:
a. Se o bloco Bx no qual reside X não está na memória principal então é emitido
um input(Bx).
b. Designa a xi o valor de X a partir do bloco de buffer.
Sempre que uma transação realiza uma escrita, é essencial que o registro de
log para aquela escrita seja criado antes de o banco de dados ser modificado. Havendo o
registro de log, podemos enviar a modificação ao banco de dados quando ela for
conveniente. Também conseguimos inutilizar uma modificação que já tenha sido enviada ao
banco de dados. Podemos desfazê-la usando o campo de valor antigo do registro de log.
A técnica de adiar modificações garante a atomicidade de transações quando
todas as modificações do banco de dados são escritas no log, adiando a execução de todas
as operações write de uma transação até sua efetivação parcial. Quando uma transação é
parcialmente efetivada, as informações no log associadas àquela transação são usadas para
a execução das escritas adiadas. Se o sistema cair antes de completar a transação ou se a
transação for abortada, então as informações do log são simplesmente ignoradas.
Para ilustração, reconsidere nosso exemplo de sistema bancário simplificado.
Seja T0 uma transação que transfere 50 reais da conta A para a conta B. Essa transação é
definida como segue:
Usando o log, o sistema pode lidar com qualquer falha que resulte em perda
de informação no armazenamento volátil. O esquema de recuperação usa o seguinte
procedimento:
Assuma que a queda ocorra logo após o registro de log do passo write(B) da
transação T0 ter sido escrito em armazenamento estável (a). Quando o sistema retorna,
nenhuma ação refazer tem de ser tomada, já que nenhum registro de efetivação aparece no
log. Agora assumamos que a queda venha logo após o registro de log para o passo write(C)
da transação T1 ter sido escrito em armazenamento estável (b). Nesse caso, quando o
sistema retorna, a operação redo(T0) é realizado, já que o registro <T0 commit> aparece no
log em disco.
Antes que uma transação Ti inicie sua execução, o registro <Ti start> é escrito
no log. Durante sua execução, qualquer operação write(X) feita por Ti é precedida pela
escrita apropriada do novo registro corrente no log. Quando Ti é parcialmente efetivada, o
registro <Ti commit> é escrito no log.
Usando o log o sistema pode tratar de qualquer falha que não resulte na
perda de informação em armazenamento não-volátil. O esquema de recuperação usa dois
procedimentos de recuperação:
undo(Ti) retorna aos valores antigos todos os itens de dados atualizados pela
transação Ti.
redo(Ti) ajusta os valores de todos os itens de dados atualizados pela
transação Ti para os valores novos.
inutilizadas. A princípio, para isso, deveríamos pesquisar todo o log. Há duas grandes
dificuldades nessa abordagem:
1. O processo de pesquisa consome tempo.
2. Muitas das transações que, de acordo com o algoritmo, necessitam ser refeitas já
escreveram suas atualizações no banco de dados. Embora refazê-las não cause
dano algum, a recuperação torna-se mais longa.
Para reduzir esses tipos de overhead, introduzimos os checkpoints (pontos de
controle). Durante a execução, o sistema mantém o log usando uma das técnicas descritas
anteriormente. Além disso, o sistema cria checkpoints periodicamente, que exigem a
execução da seguinte sequência de ações:
1. Saída, para armazenamento estável, de todos os registros residentes na memória
principal.
2. Saída, para disco, de todos os blocos de buffer modificados.
3. Saída, para armazenamento estável, de um registro de log <checkpoint>.
Não é permitido às transações processar quaisquer ações de atualização,
como escrever em um bloco de buffer ou escrever um registro de log, enquanto um
checkpoint está em progresso.
A técnica checkpoint descrita acima exige que todas as atualizações ao banco
de dados sejam temporariamente suspensas enquanto o checkpoint está em processo. É
possível modificar a técnica para permitir que as atualizações iniciem no momento em que o
registro de checkpoint é escrito, mas antes de os blocos de buffer modificados serem
escritos no disco. Então, o checkpoint gerado é um fuzzy checkpoint (ponto de controle
indistinto).
A idéia é a seguinte. Em vez de reexaminar o log de trás para frente a fim de
encontrar um registro de checkpoint, armazenamos a localização em log do último registro
de checkpoint em uma posição fixa no disco. Entretanto, essa informação não é atualizada
quando o registro checkpoint é escrito. Ao contrário, antes de o registro checkpoint ser
escrito, uma lista com todos os blocos de buffer modificados é criada. A informação último
checkpoint é atualizada somente após todos os blocos de buffer, da lista de blocos de buffer
modificados, terem sido escritos no disco. O protocolo de precedência de escrito do log
deve ser seguido quando os blocos de buffer são enviados para saída.
• Definição de dados (DDL) - permite ao usuário a definição da estrutura e
organização dos dados armazenados, e as relações que existem entre eles;
CLÁUSULAS SQL
Além dos comandos que iremos abordar abaixo, existem cláusulas que
permitem criação de visões, trabalho com definição de índices, que auxiliam nas pesquisas,
e possibilidades de junções de duas ou mais tabelas em condições de consultas.
Possibilidades que podem ser estudadas posteriormente, aumentando o conhecimento à
cerca da linguagem de consultas SQL.
Exemplos:
f. Cláusula UPDATE
g. Cláusula DELETE
Exemplo: apagar todos os registros da tabela vendedor cuja faixa de
comissão seja NULA.
h. Cláusula SELECT
EXEMPLOS:
Situação problema: desejamos colher informações a cerca das colunas
(descrição, unidade, valor_unitário) da tabela produto.
Situação problema: desejamos colher informações a cerca de todas as
colunas de nossa tabela vendedor.
Situação problema: podemos também quantificar o número de vezes de um
determinado valor ou de uma condição. Neste exemplo queremos saber quantos
vendedores (COUNT) ganham acima de R$2.500,00 de salário fixo.
Terra adorada,
Entre outras mil,
És tu, Brasil,
Ó Pátria amada!
Dos filhos deste solo és mãe gentil,
Pátria amada, Brasil!