Buscar

E-book 2 Tópico 2 - Ambientes de Alta Escalabilidade

Prévia do material em texto

Luciano Rossi
BANCO DE DADOS EM 
AMBIENTES DE ALTA 
ESCALABILIDADE
E-book 2
Neste E-Book:
INTRODUÇÃO ����������������������������������������������������������� 3
ARMAZENAMENTO, INDEXAÇÃO E 
GERENCIAMENTO DE TRANSIÇÃO�������������������� 5
MEIOS DE ARMAZENAMENTO FÍSICO ������������������������������������5
INDEXAÇÃO E FUNÇÕES HASHING ���������������������������������������17
Recuperação de falhas �����������������������������������������������������������28
CONSIDERAÇÕES FINAIS ����������������������������������� 35
REFERÊNCIAS BIBLIOGRÁFICAS & 
CONSULTADAS �������������������������������������������������������38
2
INTRODUÇÃO
Os Sistemas Gerenciadores de Banco de Dados 
(SGBD) fornecem ao usuário uma visão de alto nível 
do banco de dados, abstraindo a complexidade do 
hardware, sobretudo em relação ao modo com que 
os dados são armazenados e recuperados� Devemos 
ter em mente que os dados são representados e ar-
mazenados como sequências de bits, em diferentes 
dispositivos de armazenamento�
Existem diferentes dispositivos responsáveis pelo ar-
mazenamento de dados� Podemos utilizar um disco 
magnético ou uma memória flash para o armazena-
mento não volátil de dados�
Os dispositivos de armazenamento não voláteis são 
os que mantêm os dados armazenados mesmo que 
não energizados� Observe que isso não ocorre com a 
memória principal, na qual os dados não persistem 
quando o dispositivo não está energizado� Outros 
dispositivos de armazenamento, comumente utili-
zados para a realização de backup, são os discos 
ópticos e as fitas magnéticas.
Cada tipo de dispositivo de armazenamento tem 
características particulares� Essas características 
são importantes para a determinação da forma 
como os dados são armazenados e, posteriormen-
te, recuperados�
Sendo assim, neste módulo trataremos dos dispo-
sitivos de armazenamento e suas características 
3
principais, como velocidade de acesso aos dados, 
custo por unidade e capacidade de armazenamento�
Além disso, analisaremos as diferentes formas de 
indexação utilizadas em bancos de dados, conside-
rando as estruturas de índices e as funções hashing� 
Por fim, discutiremos os tipos de falhas que podem 
ser um resultado das transações malsucedidas e as 
respectivas formas de recuperação�
4
ARMAZENAMENTO, 
INDEXAÇÃO E 
GERENCIAMENTO DE 
TRANSIÇÃO
O armazenamento de dados nos computadores con-
sidera um contexto binário, ou seja, os dados são 
representados como bits nos diferentes dispositivos� 
Existem vários tipos de dispositivo de armazenamen-
to que utilizam diferentes mecanismos para viabilizar 
a representação dos dados em formato binário�
Alguns desses dispositivos são capazes de arma-
zenar uma grande quantidade de informações, a um 
custo baixo por unidade armazenada, mas não são 
eficientes do ponto de vista da velocidade de acesso. 
Existem dispositivos que são muito rápidos, mas, 
devido ao alto custo por unidade de armazenamento, 
têm capacidade limitada�
Com base nessas premissas, exploraremos os dife-
rentes tipos de dispositivos de armazenamento, evi-
denciando as principais características e aplicações�
Meios de armazenamento físico
A velocidade com que um usuário de computador 
recebe uma resposta, para uma solicitação especí-
fica, depende de vários fatores. Por exemplo, algo-
ritmo implementado, capacidade do processador, 
dispositivo de armazenamento etc� Nesse sentido, os 
5
dispositivos de armazenamento exercem um papel 
importante no desempenho oferecido pelos sistemas 
computacionais� Entre os dispositivos de armazena-
mento comumente disponíveis, podemos destacar o 
cache, memórias, flash, discos magnéticos e ópticos 
e fitas magnéticas.
O cache é um dispositivo de armazenamento que liga 
o processador e a memória principal� Seu objetivo 
é reduzir o tempo gasto para acessar diretamente a 
memória principal� Os blocos de dados são trazidos 
da memória principal para o cache� Note que o aces-
so ao cache é mais rápido assim, por isso, o cache 
acumula momentaneamente os dados que serão 
enviados à memória principal ou que virão dela� A 
estratégia é duplicar os blocos de dados da memó-
ria principal em um dispositivo de armazenamento 
menor e mais rápido�
Podemos ter diferentes níveis de cache, que são 
definidos pela sua localização. O cache pode estar 
presente no próprio chip do processador (nível 1), 
em um chip separado e acoplado ao processador 
(nível 2) e na placa mãe (nível 3)�
Os níveis de cache intermediam o fluxo de dados 
entre a memória principal e o processador� Desse 
modo, quanto mais próximo ao processador está o 
cache, é menor e mais rápido; quanto mais próximo 
à memória principal, o cache é maior e mais lento�
A memória principal armazena os dados disponí-
veis para o processamento, ou seja, as instruções de 
máquina operam sobre ela� Podemos ter diferentes 
6
tamanhos para a memória principal, dependendo 
das características do computador� Porém, nunca 
é suficientemente grande para armazenar o banco 
de dados completo� Tal qual o cache, a memória 
principal é volátil, ou seja, o conteúdo armazenado 
é perdido quando o sistema não está energizado�
A memória flash tem características similares à 
memória principal; as principais diferenças são a 
não volatilidade e a velocidade menor, mas ambas 
são dispositivos eletrônicos, ou seja, não possuem 
partes móveis, o que aumenta o desempenho quando 
comparadas aos dispositivos eletromecânicos com 
partes móveis e são, portanto, mais lentos�
São exemplos de memória flash: pen drives, cartões 
de memória e unidades em estado sólido ou Solid-
State Drive (SSD)�
O SSD tem sido utilizado como substituto para os 
discos magnéticos (Hard Disk – HD), visto que apre-
senta um desempenho superior com um custo por 
unidade de armazenamento reduzido ano a ano�
Discos magnéticos
Os discos magnéticos caracterizam-se pela grande 
capacidade de armazenamento de dados� Assim, o 
banco de dados inteiro pode ser armazenado em um 
disco magnético� Os dados utilizados pelas transa-
ções devem ser movidos do disco magnético para 
a memória principal, onde as operações serão rea-
lizadas e, posteriormente, as alterações devem ser 
atualizadas no disco�
7
O HD é um disco magnético que se caracteriza por 
um prato circular construído a partir de material não 
magnético e que recebe uma camada de material 
magnetizável� Os discos magnéticos são dispositivos 
eletromecânicos; logo, contêm partes móveis, o que 
impacta negativamente no desempenho�
Os grandes servidores de dados utilizam um subsis-
tema de armazenamento na forma de um conjunto 
redundante de discos independentes, os Redundant 
Array of Independent Disks (RAID)� Esse subsistema é 
transparente ao usuário e tem por objetivo aumentar 
a segurança ou o desempenho do sistema�
Dependendo do nível RAID, que é a combinação de 
dois ou mais discos, podemos ter um aumento (i) na 
redundância dos dados, (ii) na taxa de transferência 
e (iii) na taxa de processamento de solicitações�
O nível RAID 0 é constituído de dois ou mais discos, 
em que os blocos de dados se dividem. Essa configu-
ração permite um ganho importante de desempenho, 
pois as operações de leitura e escrita são feitas em 
paralelo nos discos�
Por exemplo, imagine um bloco de dados com o qual 
gastaríamos um tempo t para escrevê-lo no disco� 
Supondo RAID 0 com dois discos, o bloco de da-
dos será dividido em duas partes: a primeira será 
armazenada em um disco; a segunda parte no outro 
disco� Dessa forma, as duas partes do bloco de da-
dos são gravadas em paralelo (ao mesmo tempo), 
propiciando que a operação seja realizada em um 
tempo igual a t/2�
8
O exemplo anterior ilustrou um ganho de desempe-
nho na realização das operações em disco� Neste 
caso, o tempo para a execução da operação foi redu-
zido pela metade, visto que se utilizaram dois discos� 
Caso contássemos com quatro discos em RAID 0, o 
tempo para a realização das operações seria redu-
zido a um quarto do tempo necessário para realizar 
a operaçãoem um único disco�
Para uma melhor compreensão, temos uma analogia 
para o ganho de desempenho propiciado por RAID 
0. Suponha uma fila em um caixa de supermercado 
com 10 pessoas, com as quais o atendente gastará, 
em média, cinco minutos por cliente� Assim, seriam 
necessários 50 minutos para atender todos os clien-
tes� Se adicionarmos um novo caixa, a cada cinco 
minutos, dois clientes seriam atendidos em paralelo, 
e a fila terminaria em 25 minutos.
O RAID 0 utiliza o espalhamento dos dados com vis-
tas a obter um ganho de desempenho� A Figura 1 
apresenta um exemplo de RAID 0 com dois discos� 
Observe que os blocos de dados A, B, C e D são 
segmentados em duas partes, que se armazenam 
em discos diferentes�
9
RAID 0 RAID 1 RAID 5 
RAID 6 RAID 10 
RAID 1 RAID 1 
DISCO 1 DISCO 2 DISCO 3 DISCO 4 DISCO 1 DISCO 2 DISCO 3 DISCO 4 DISCO 4 
DISCO 1 DISCO 2 DISCO 1 DISCO 2 DISCO 1 DISCO 2 DISCO 3 DISCO 4 
RAID 50 
RAID 0
RAID 5 RAID 5
DISCO 1 DISCO 2 DISCO 3 DISCO 4 DISCO 5 DISCO 6 DISCO 7 DISCO 8
A1
B1
C1
D1
A2
B2
C2
D2
A1
B1
C1
D1
A1
B1
C1
D1
A1
B1
C1
P
A2
B2
P
D2
A3
P
C3
D3
P
B4
C4
D4
A1
B1
C1
P
A2
B2
P
P2
A3
P
P2
D3
P
P2
C4
D4
P2
B5
C5
D5
A1
A3
A5
A7
A1
B3
C5
D7
A2
A4
A6
A8
A2
B4
C6
D8
A1
B1
C1
P
A2
B2
P
D2
A3
P
C3
D3
P
B4
C4
D4
A5
B5
C5
P
A6
B6
P
D6
A7
P
C7
D7
P
B8
C8
D8
Figura 1: Conjuntos redundantes de discos independentes� 
Fonte: Elaboração própria�
Em RAID 0, quando um disco é perdido, há perda 
completa de todos os dados, pois o disco íntegro 
contém somente metade de cada bloco de dados, 
o que os torna inviáveis para a utilização� À medida 
que aumentamos o número de discos em RAID 0, 
aumentamos também o risco de perda de todo o 
banco de dados a partir da perda de um único disco�
O nível RAID 1 considera no mínimo dois discos e 
consiste, basicamente, do espelhamento dos da-
dos de um disco em outro, ou seja, esse nível reali-
za a replicação de dados� É uma solução simples 
para a segurança dos dados, visto que, em caso de 
10
perda de um disco, os dados permanecem íntegros 
no outro disco� Na Figura 1, temos um exemplo em 
RAID 1 com dois discos� O principal problema para 
essa solução é o consumo do dobro de discos para 
o armazenamento�
O nível RAID 5 considera dados de paridade dos blo-
cos de dados, criando uma camada de redundância 
sem que seja necessário gastar metade dos discos 
para isso� O RAID 5 utiliza uma estratégia de pari-
dade distribuída e necessita, pelo menos, de três 
discos�
Os blocos de dados são distribuídos entre os discos 
disponíveis� Além disso, um algoritmo é responsável 
por gerar dados de paridade que serão utilizados 
para a recomposição do bloco em caso de perda de 
um dos discos� Assim, RAID 5 integra segurança e 
desempenho em um único arranjo de discos�
É importante notar que os dados de paridade consu-
mirão o equivalente a um disco do arranjo, mesmo 
que haja mais que três discos na composição� Na 
Figura 1, encontra-se um exemplo em RAID 5 com 
quatro discos, os dados de paridade são distribu-
ídos entre os discos, consumindo o equivalente a 
um disco�
O nível RAID 6 é similar ao RAID 5, ou seja, utiliza 
dados de paridade para a recomposição dos blocos 
de dados em caso de perda de discos� A principal 
diferença observada em RAID 6 é a estratégia da 
redundância dupla, pois RAID 6 realiza a duplicação 
dos dados de paridade, de modo que o conjunto de 
11
dados se mantenha íntegro, mesmo com a perda 
de dois discos� Essa solução deve contar com, no 
mínimo, quatro discos, dado que dois discos serão 
consumidos para armazenamento dos dados de 
paridade�
Na busca por mais eficiência das operações e maior 
segura dos dados, é possível considerar a combi-
nação de estratégias de organização dos discos, 
ou seja, podemos utilizar, por exemplo, uma combi-
nação que venha a possibilitar o espelhamento dos 
dados (RAID 1), combinando com uma estratégia 
que considere o espalhamento dos dados (RAID 0)� 
Comumente, esse tipo de combinação é denominado 
RAID 1 + 0 ou RAID 10�
O nível RAID 10 necessita de, pelo menos, quatro 
discos para sua implementação� Assim, os blocos 
de dados são divididos (espalhados) por dois pares 
de discos que, por sua vez, armazenam os dados de 
forma duplicada (espelhada) em cada um dos discos�
Na Figura 1, temos um exemplo de quatro discos em 
RAID 10� Note que os blocos de dados são espelha-
dos em cada par de discos e espalhados em dois 
pares� Desse modo, é possível obter um aumento 
de desempenho e, ao mesmo tempo, manter certo 
nível de segurança dos dados�
Em um arranjo com quatro discos, como é o caso na 
Figura 1, poderíamos ter a perda de até dois discos, 
desde que isso não ocorre em um mesmo par, sem 
que haja a perda dos blocos de dados armazenados�
12
Considerando a Figura 1 como referência, temos um 
último exemplo que considera oito discos, organi-
zados em RAID 50 (ou RAID 5 + 0)� Esse nível RAID 
precisa de, no mínimo, seis discos para a sua imple-
mentação� A estratégia é dividir os blocos de dados 
em dois ou mais segmentos em RAID 5� Com isso, 
teremos um aumento no desempenho das operações 
sobre os discos e, em caso de catástrofe, o sistema 
suporta a perda de até dois discos por arranjo�
Além dos níveis descritos anteriormente, existem 
outras possibilidades de níveis RAID� Por exemplo, o 
nível RAID 60 (ou RAID 6 + 0) considera dois ou mais 
arranjos em RAID 6, os quais receberão os blocos de 
dados espalhados por eles (RAID 0)�
Podemos ter ainda o nível RAID 2, que considera os 
códigos de correção de erros; RAID 3, que utiliza a 
paridade intercalada por bit; e o nível RAID 4, que 
utiliza a paridade intercalada por bloco�
Independentemente do nível RAID utilizado, o obje-
tivo sempre será ou o aumento do desempenho das 
operações ou o aumento do nível de segurança dos 
dados, ou ambos simultaneamente�
Discos ópticos
Os discos ópticos são dispositivos de armazenamen-
to de dados muito populares em um passado recente� 
Os principais tipos de discos ópticos são Compact 
Disk (CD), com capacidade de armazenamento de 
até 700 MB de dados, Digital Video Disk (DVD), que 
pode armazenar de 4,7 a 8,5 GB de dados�
13
Esses dispositivos de armazenamento são fabrica-
dos em policarbonato revestidos com uma camada 
de algum material altamente reflexivo, comumente 
alumínio� A gravação de dados em tais dispositivos 
utiliza sulcos microscópios na superfície reflexiva 
que, após a gravação, se protege com uma cobertura 
translúcida de laca ou verniz�
Os primeiros discos ópticos eram somente para leitu-
ra, utilizados para o armazenamento de áudio e vídeo� 
Um fotossensor percorre a superfície, em intervalos 
regulares, identificando ou não a presença de sulcos. 
Um início ou final de sulco indica o valor binário 1, e 
a ausência de mudança na elevação indica o valor 
0� Outras versões que consideravam apenas uma 
gravação ou múltiplas gravações foram igualmente 
utilizadas no passado�
Fitas magnéticas
As fitas magnéticas foram as precursoras no quesi-
to “dispositivo de armazenamento de dados”� Suas 
principais características são o baixo custo e a alta 
capacidade de armazenamento de dados, princi-
palmente quando utilizadas como dispositivo para 
manter grandes conjuntos de dados� Por exemplo, 
dados de satélites, que podem conter até centenas 
de terabytes (TB)�
A Figura 2 apresenta a hierarquia dos dispositivos 
de armazenamento de dados� Nela, os dispositivos 
localizados na parte superior são os que apresentam 
maior custo por bit armazenado, mas que oferecem 
acesso mais rápido aos dados� Por outro lado, na 
14
parte inferior da figura, localizam-se os dispositivos 
de armazenamento para os quais o custo por bit ar-
mazenado é menor, tal qual a velocidade de acesso:
Cache
Memória
principal
Memória flash
Discos magnéticos
Discos ópticos
Fitas magnéticas
armazenamento
primário
volátil
armazenamento
secundário
ou on-line
não volátil
armazenamento
terciário
ou off-line
não volátil
Rápido
Caro
Lento 
Barato
Figura2: Hierarquia de dispositivos de armazenamento� 
Fonte: Elaboração própria�
O cache, por exemplo, tem maior custo por bit arma-
zenado do que a memória principal� No entanto, ofe-
rece maior velocidade de acesso� Essa observação 
justifica-se, de certo modo, pela quantidade de dados 
que cada dispositivo pode armazenar, ou seja, quanto 
maior o custo de armazenamento por bit, menor a 
disponibilidade de espaço de armazenamento�
As características dos dispositivos de armazena-
mento justificam a forma como são utilizados. O 
15
cache e a memória principal são dispositivos de ar-
mazenamento primário, ou seja, os dados disponíveis 
para utilização devem estar armazenados nesses 
dispositivos�
Outra característica importante nesses dispositivos 
é a volatilidade� Desse modo, os dados só estão dis-
poníveis enquanto houver energia no sistema, uma 
vez a falta de energia, os dados são perdidos�
Comumente, a memória flash e os discos magnéticos 
são considerados dispositivos de armazenamen-
to secundário ou on-line� Nesses casos, os dados 
processados devem ser movidos para a memória 
principal e, sempre que modificados, os dados devem 
ser atualizados nos dispositivos de armazenamento 
secundário�
Esses tipos de dispositivo armazenam os dados de 
forma perene, ou seja, mesmo que não haja energia 
no sistema, os dados permanecem armazenados� 
Nesse sentido, a memória flash e os discos magnéti-
cos são dispositivos de armazenamento não voláteis�
Os discos ópticos e as fitas magnéticas são disposi-
tivos de armazenamento classificados como terciário 
ou off-line� Devido à capacidade que os dispositivos 
têm de armazenar grandes quantidades de dados, 
principalmente as fitas magnéticas, são utilizados 
como dispositivos para back-up�
O custo por bit armazenado é bastante reduzido, tal 
qual a velocidade de acesso aos dados� O termo off-
-line refere-se ao fato de que os dados não estão dis-
16
poníveis diretamente para uso, pois devem ser lidos e 
movidos para os dispositivos secundários e, a partir 
disso, ficam disponíveis a dispositivos primários. 
Indexação e funções hashing
As consultas realizadas sobre o banco de dados re-
ferem-se muitas vezes apenas a poucos registros ou 
a um valor específico. Nesse sentido, não é eficiente 
que várias leituras sejam feitas até que se encontre o 
registro ou valor buscado� O sistema deve ser capaz 
de ler o dado objetivo de maneira direta�
Quando precisamos identificar um assunto específico 
em um livro, por exemplo, não folhamos todas as 
páginas até encontrar o assunto desejado� Para isso, 
utilizamos o índice do livro, no qual encontramos o 
número da página que contém o assunto de interes-
se� Em um sistema de banco de dados, a lógica é 
similar: o sistema utiliza técnicas de indexação para 
facilitar a busca por uma determinada informação 
armazenada no banco de dados�
Os índices utilizados em um sistema de banco de 
dados podem ser de dois tipos básicos: os índices 
ordenados, organizados em uma ordem dos valores, 
e os índices de hash, que realizam o mapeamento 
para uma distribuição uniforme de valores�
A busca por determinados registros em um arquivo 
é feita a partir de uma chave de busca, isto é, um 
índice em um arquivo� Assim, se houver diferentes 
índices, haverá diferentes chaves de busca�
17
Uma estrutura de índices é uma lista ordenada em 
que cada qual é associado a um ponteiro (endereço 
de memória) para o registro� A busca por um de-
terminado registro é feita na estrutura de índices e, 
quando encontrado, o acesso ao registro é feito por 
meio do ponteiro associado ao índice�
Quando os registros no arquivo são armazenados 
em ordem, dizemos que os índices na estrutura são 
índices de agrupamento ou primários� Os índices 
que mapeiam as chaves de busca não ordenadas 
são chamados de índices secundários� Note que, no 
contexto desta unidade, por valores ordenados nos 
referimos à ordem sequencial�
Um registro em uma estrutura de índices é composto 
por um valor da chave de busca e um, ou mais, pon-
teiros para registros que tenham o valor da chave 
de busca�
Na Figura 3ª, temos uma estrutura de índices, na 
qual cada registro é composto pela chave de busca, 
neste caso, consideramos o ID, e um ponteiro para 
o endereço do registro� Perceba que o ponteiro é 
representado por uma circunferência colorida e uma 
seta que aponta para a localização do registro no 
arquivo (Figura 3c)�
18
10101
32343
76543 
10101
12121
15151
22222
32343
33456
45565
 58583
76543
76766
83821
98345
10101
12121
15151
22222
32343
33456
45565
 58583
76543
76766
83821
98345
Srinivasan
WU
Mozart
Einstein
El Said
Gold
Katz
 Califieri
Singh
Crick
Brandt
Kim
Ciência da Computação
Economia
Música
Física
História
Física
Ciência da Computação
 História
Economia
Biologia
Ciência da Computação
Engenharia Elétrica
65000
90000
40000
95000
60000
87000
75000
62000
80000
72000
92000
80000
(a) (b) (c)
/
ID NOME DEPARTAMENTO SALÁRIO
Figura 3: Índice esparso (a), índice denso (b) e arquivo se-
quencial� Fonte: Adaptada de Silberschatz, Sundarshan e 
Korth (2016)�
Para cada registro no arquivo, há um ponteiro indican-
do o próximo registro (Figura 3c)� Nesse exemplo, es-
tamos considerando um arquivo em que os registros 
estão ordenados sequencialmente pelo atributo ID�
O índice denso é composto por um registro na es-
trutura de índices para cada valor-chave no arquivo� 
Na Figura 3, temos uma estrutura de índices (b) para 
cada valor-chave no arquivo (c)�
Nesse caso, o valor-chave é o atributo ID, porém, 
poderíamos ter qualquer outro atributo como valor-
-chave, e outra estrutura de índices correspondente a 
tal atributo� Uma busca pelo valor-chave 22222 seria 
realizada na estrutura de índices de agrupamento 
denso e, quando o valor-chave fosse encontrado, o 
ponteiro associado identificaria o registro completo 
no arquivo�
19
Caso existam vários registros com ID = 22222, o 
valor-chave, na estrutura de índices, deve estar as-
sociado a uma lista de ponteiros, um para cada re-
gistro no arquivo�
No índice esparso, somente alguns valores-chave 
são pertinentes à estrutura de índices� Essa aborda-
gem só pode ser considerada quando os registros 
no arquivo estão ordenados sequencialmente pelo 
valor-chave utilizado� A Figura 3a é um exemplo de 
estrutura de índices de agrupamento esparso�
Nessa abordagem, supondo que queiramos encontrar 
o valor-chave ID = 22222, devemos buscar na estrutu-
ra de índices o valor-chave que seja menor ou igual ao 
valor procurado. Assim, o valor-chave identificado na 
estrutura de índices que corresponde aos critérios é o 
valor 10101. E o registro correspondente é identifica-
do no arquivo por meio do ponteiro associado, visto 
que os registros estão ordenados sequencialmente, 
iniciamos uma busca a partir daquela posição até 
encontrar o valor-chave que buscamos�
A utilização de índices esparsos pode não ser tão efi-
ciente quanto a utilização de índices densos, porém, 
os índices esparsos requerem menor espaço para o 
armazenamento da estrutura de índices, por contar 
de seu número menor de registros�
Não é raro ter tabelas (relações) com um grande 
número de registros em disco� Assim, a estrutura de 
índices, no caso de índices densos, teria o mesmo 
número de registros que a tabela em disco� Note 
que a estrutura de índices deve ser movida para a 
20
memória principal para a identificação do valor-chave 
e do ponteiro associado� Com isso, é possível que a 
estrutura de índices consuma grande parte da me-
mória disponível, tornando as operações lentas�
Mesmo no caso de utilizarmos uma estrutura de ín-
dices esparsa, cada ponteiro na estrutura indicará 
um agrupamento em disco com muitos registros, os 
quais devem ser percorridos sequencialmente até 
que se encontre o valor-chave buscado�
As operações de buscas sequenciais são executa-
das sobre o agrupamento, indicado pelo ponteiro, 
na memória principal, o que também implica mover 
todo o agrupamento para a memória, tornando as 
operações lentas�A solução, neste caso, é a utilização de índices mul-
tiníveis� Podemos utilizar as estruturas de índices 
esparsas em disco como qualquer outro arquivo 
sequencial� Poderíamos compor uma estrutura de 
índices externos para as estruturas de índices inter-
nos em disco, de modo que somente a primeira seria 
movida para a memória e, a partir da identificação do 
intervalo do valor-chave e do correspondente pontei-
ro, a estrutura de índices internos seria movida para 
a memória�
Observe a Figura 4� Imagine que estamos interes-
sados no registro cujo ID = 20856 e contamos com 
uma estrutura de índices esparsos de dois níveis� 
Note que a estrutura de índices externos (a) contém 
ponteiros associados aos valores-chave entre 10�000 
21
e 50�000; inicialmente, apenas esses registros seriam 
movidos para a memória principal�
Em seguida, o endereço da estrutura de índices inter-
nos, correspondente ao valor-chave que se busca, se-
ria identificado por meio do ponteiro associado com 
o valor-chave em (a)� Assim, a estrutura de índices 
internos (b), no intervalo de 20�000 até 20�900, seria 
movida para a memória, e o procedimento se repe-
tiria, ao identificar o bloco de dados que contém o 
valor-chave buscado� Nessa última etapa, uma busca 
sequencial é realizada sobre o bloco de dados obtido�
Note que é possível criar tantos níveis quanto forem 
necessários para a otimização das consultas sobre 
os arquivos da base de dados� A utilização de índices 
multiníveis é mais eficiente na busca por registros 
que a utilização de árvores de busca binária, pois 
executam menos acessos ao disco�
10000
20000
30000
40000
50000
10000
10100
10800
10900
20000
20100
20800
20900
30000
30100
30300
30400
10101
10121
10151
10172
Srinivasan
WU
Mozart
Einstein
Ciência da Computação
Economia
Música
Física
65000
50000
40000
95000
20843
20856
20865
20883
El Said
Gold
Katz
Califieri
História
Física
Ciência da Computação
História
60000
87000
75000
62000
30343
30366
30321
30345
Singh
Crick
Brandt
Kim
Economia
Biologia
Ciência da Computação
Engenharia Elétrica
80000
72000
92000
80000
Figura 4: Índices multiníveis� Fonte: Adaptada de 
Silberschatz, Sundarshan e Korth (2016)�
22
As abordagens de indexação estudadas são aplicá-
veis quando temos os registros no arquivo ordenados 
sequencialmente por algum valor-chave� No entanto, 
quando os registros não apresentam essas caracte-
rísticas, as abordagens anteriores são pouco úteis� 
Nesse contexto, a utilização de índices secundários 
pode ser a solução para tal problema�
A Figura 5 apresenta os registros ordenados pelo 
valor-chave ID. Suponha que queiramos identificar 
o(s) registro(s) que possui(em) o valor do atributo 
SALÁRIO igual a 80�000�
Observe que os registros não estão ordenados pelo 
valor desse atributo, assim, a solução seria percorrer 
todos os registros verificando os que atendem ao 
critério estabelecido�
Percorrer todos os registros em um arquivo não é 
uma boa solução� Em vez disso, podemos utilizar 
uma estrutura de índices secundários, em que cada 
registro da estrutura contém um valor-chave e um 
ou mais ponteiro associado�
Essa estrutura assemelha-se à estrutura de índices 
densos, na qual todos os registros no arquivo têm 
um registro correspondente na estrutura� A principal 
diferença nas estruturas de índices secundários é que 
o endereço associado a cada registro na estrutura 
é um ponteiro para outra estrutura composta pelos 
ponteiros, para os registros no arquivo que atendam 
ao critério de busca estabelecido�
23
Voltemos ao exemplo da busca pelos registros cujo 
atributo SALÁRIO é igual a 80�000� A princípio, re-
alizamos a busca pelo valor-chave na estrutura de 
índices, onde os valores são ordenados linearmente, 
o que viabiliza um processo de busca mais eficiente.
Quando o valor é localizado, o ponteiro associado 
a ele indica a estrutura que contém o(s) ponteiro(s) 
para o(s) registro(s)� Nesse caso, temos dois regis-
tros cujos valores para o atributo SALÁRIO é igual 
a 80�000: ID = ‘76542’ e ID = ‘98345’� Ambos foram 
identificados por meio de seus endereços armaze-
nados na estrutura secundária, de forma direta:
/
ID NOME DEPARTAMENTO SALÁRIO
Ciência da Computação
Economia
Música
Física
História
Física
Ciência da Computação
História
Economia
Biologia
Ciência da Computação
Engenharia Elétrica
40000
60000
62000
65000
72000
75000
80000
87000
90000
92000
95000
10101
12121
15151
22222
32343
33456
45565
58583
76543
76766
83821
98345
Srinivasan
WU
Mozart
Einstein
El Said
Gold
Katz
Califieri
Singh
Crick
Brandt
Kim
65000
90000
40000
95000
60000
87000
75000
62000
80000
72000
92000
80000
Figura 5: Índices secundários� Fonte: Adaptada de 
Silberschatz, Sundarshan e Korth (2016)�
Apesar de aumentar a eficiência das operações em 
disco, o uso de arquivos, organizados sequencialmen-
te, é sempre ligado ao acesso de uma estrutura de 
índices, o que ainda resulta em operação adicional 
sobre o disco�
24
Alternativamente, podemos considerar a utilização 
de técnicas de hashing para evitar o acesso a uma 
estrutura de índices�
Uma função hashing é responsável por mapear um 
valor chave K para um endereço B de um bloco de dis-
co� Com isso, os blocos de disco são denominados 
buckets e podem ser considerados para referenciar 
também às unidades de memória maiores ou meno-
res que um bloco de disco�
Uma função hashing h mapeia um valor-chave para 
um endereço de bucket (h (Ki )=Bi)� Desse modo, os 
endereços dos buckets podem ser obtidos direta-
mente em função do valor da chave, sem consultar 
qualquer tipo de estrutura de índice, o que aumenta 
a eficiência das operações.
As operações de inserção, pesquisa e remoção de 
registros nos buckets é bastante simples� Para inse-
rir um registro cujo valor chave seja Ki, utilizamos a 
função hashing e identificamos o endereço do bucket 
de destino da seguinte forma: h (Ki )=Bi, e o registro 
cujo valor-chave é Ki será inserido no bucket Bi�
A pesquisa segue o mesmo princípio: primeiro iden-
tificamos o bucket por meio da função hashing sobre 
o valor da chave do registro e, no bucket identificado, 
realizamos uma pesquisa sobre todos os valores-
-chave, retornando o registro correspondente. Por fim, 
a remoção segue o mesmo procedimento da pesqui-
sa, apenas depois de o registro ser identificado, ele 
será removido do bucket, ao invés de ser retornado�
25
Em um mundo ideal, a função hashing mapeará os 
valores-chave uniformemente, para todos os buckets 
disponíveis� Caso contrário, se os valores-chave fo-
rem todos mapeados para um mesmo bucket, tería-
mos que realizar uma busca no bucket e, com isso, 
identificar o registro desejado. Verificamos que esse 
tipo de busca é indesejável�
Uma distribuição de valores-chave em buckets deve 
ser uniforme, os buckets devem ter o mesmo número 
de registros, e aleatória, o valor resultante da função 
hashing não deve se associar com qualquer tipo de 
ordenação dos valores de chaves�
Considere que queremos mapear os registros do 
arquivo utilizado nos exemplos anteriores para as 
estruturas de índices� Os registros são mapeados 
por meio do valor do atributo DEPARTAMENTO e de-
senvolvemos uma função hashing que recebe esse 
valor� A partir da primeira letra, indica o endereço de 
um dos 26 buckets considerados para a distribuição�
Nota-se que, neste caso, não teríamos uma distribui-
ção uniforme, visto que os nomes de departamento 
que iniciam com as letras ‘X’ ou ‘Y’ são em número 
menor do que os departamentos que iniciam com 
‘B’ ou ‘R’, por exemplo�
Por outro lado, suponha a utilização do valor do atri-
buto SALÁRIO e uma função hashing que distribua os 
valores em nove buckets da seguinte forma: salário 
entre R$ 10�000,00 e R$ 20�000,00 são mapeados 
para o bucket 1; salários entre R$ 20�001,00 e R$ 
30�000,00 são mapeados para o bucket 2 e assim su-
26
cessivamente até que os salários entre R$ 90�001,00 
e R$ 100�000,00 são mapeados para o bucket 9�
Os valores são distribuídos entre os bucketsunifor-
memente, mas observamos que há determinados 
valores de salário que ocorrem mais frequentemente� 
Assim, alguns buckets terão um maior número de 
registros que outros� Isso ocorre porque os valores 
de salário não ocorrem de modo aleatório, dessa 
maneira, a distribuição dos valores não é uniforme�
Outro problema com as funções hashing é quando 
elas mapeiam um determinado valor para um bucket 
sem espaço para o armazenamento� Nesse caso, 
ocorre o estouro do bucket, que acontece devido 
ao número insuficiente de buckets ou porque um 
bucket recebe um número maior de registros, mes-
mo havendo uma quantidade suficiente de buckets�
Esse motivo para o estouro denomina-se “distorção 
do bucket”, ocorrendo quando vários registros têm 
o mesmo valor-chave ou quando a função hashing 
não atende às propriedades descritas anteriormente�
Um possível tratamento para o estouro de buckets é 
considerar um bucket de estouro, no qual os registros 
que não podem ser alocados no bucket original são 
armazenados no bucket de estouro�
Esse procedimento é repetido quando um bucket 
de estouro também estiver cheio, daí outro bucket 
de estouro é oferecido pelo sistema� Os buckets ori-
ginais e de estouro são interligados por uma lista 
27
ligada, de modo que todos os registros possam ser 
encontrados�
Recuperação de falhas
Estudamos anteriormente que as transações podem 
concorrer pelo mesmo recurso ou, mais especifica-
mente, por um mesmo item de dado� A utilização de 
um mesmo item de dado por transações diferentes 
pode ocasionar inconsistência do banco de dados� 
Nesse sentido, verificamos que o SGBD deve imple-
mentar um controle de concorrência, de modo que as 
transações não utilizem um item de dado de maneira 
concorrente�
Os protocolos de controle de concorrência podem ser 
mais ou menos restritivos, a depender da estratégia 
adotada� Assim, os protocolos mais restritivos po-
dem gerar problemas como deadlock ou starvation�
Os protocolos menos restritivos, como o que conside-
ra a utilização das marcas de tempo, consideram as 
estratégias que previnem a inconsistência do banco 
de dados, sem provocar a ocorrência de deadlock 
ou starvation�
Apesar de podermos contar com diferentes aborda-
gens para o controle de concorrência das transações, 
ainda assim podemos nos deparar com problemas 
de consistência no banco de dados� Nesses casos, 
é necessário que o banco de dados seja recupera-
do e retorne a um estado de consistência anterior à 
execução das transações�
28
Nessa seção, aprofundaremos no processo de recu-
peração de um banco de dados� A recuperação é o 
processo de restauração do banco de dados a um 
estado de consistência, podendo ser aplicado em 
situações de falhas� As falhas podem ser resultantes 
de diferentes fatores, como falha nos discos, queda 
de energia elétrica ou problemas com o software� 
Outra possibilidade é a ocorrência de falhas oriundas 
das transações, por conta da violação de alguma 
restrição de integridade do banco de dados ou por 
impasses, por exemplo�
O processo de recuperação de falhas está intima-
mente ligado ao tipo de armazenamento dos dados� 
Como verificado anteriormente, podemos considerar 
três tipos de armazenamento: volátil, não volátil e 
estável�
O armazenamento estável considera a replicação dos 
dados em diferentes meios de armazenamento não 
voláteis� A implementação de sistemas RAID permite 
que os dados permaneçam íntegros mesmo com a 
ocorrência de perda de disco, porém, esse tipo de 
solução não é imune a desastres como incêndios 
ou inundações�
A utilização de backups pode representar uma solu-
ção para o armazenamento estável de dados� Os da-
dos podem ser armazenados, por exemplo, em fitas 
magnéticas e removidos, fisicamente, para um local 
diferente daquele em que o banco de dados está em 
operação� Nesse caso, temos ainda um problema 
de atualização dos dados, visto que não é possível 
29
realizar a gravação e a remoção física dos dados em 
backup para fora da instalação e, caso ocorra um 
problema, os dados em backup não refletirão o último 
estado do banco de dados, resultando em sua perda�
Um ponto crítico da recuperação de falhas é quando 
ocorrem em meio a uma atualização� As atualizações 
no banco de dados são registradas em um log (lista 
de eventos relevantes) que é mantido em um local 
diferente de onde o banco de dados está operando�
O log é uma lista de registros das atividades de atuali-
zação do banco de dados� Um registro típico em log é 
composto por um identificador da transação que es-
creveu um valor no banco de dados, um identificador 
para o item de dado que foi atualizado, comumente 
esse identificador indica um bloco de dados no disco 
e um deslocamento dentro desse bloco, e pelos valo-
res antigo e novo que descrevem, respectivamente, 
o valor do item de dado antes e depois da escrita�
Considera-se uma transação efetivada somente 
quando seu último registro de log foi transferido para 
armazenamento estável� Os registros em log captu-
ram todos os valores de um item de dado atualizado�
Assim, caso ocorra uma falha e uma transação pre-
cise ser refeita, o último valor em log do item de 
dado é utilizado (redo)� Por outro lado, caso o banco 
de dados precise ser revertido a um estado anterior 
(undo), os valores antigos para os itens de dados 
são utilizados, a depender do ponto para o qual se 
pretenda reverter o estado do banco de dados�
30
Com o objetivo de ilustrar a utilização do log para 
as transações redo e undo, considere o seguinte: 
um sistema bancário cuja transação T0 realiza uma 
transferência de R$ 500,00 da conta A para a conta 
B assim:
T0:
 read(A);
 A A - 50;
 write(A);
 read(B);
 B B + 50;
 write(B)�
Considere, ainda, uma transação T1 que realiza um 
saque de R$ 100,00 da conta C:
T1:
 read(C);
 C C - 100;
 write(C)�
Note que os registros de log referente às transações 
teriam o seguinte:
<T0 start>
<T0,A,1000,950>
<T0,B,2000,2050>
31
<T0 commit>
<T1 start>
<T1,C,700,600>
<T1 commit> 
Para o caso de haver alguma falha, com a utilização 
do log, o sistema pode recuperar um estado consis-
tente do banco de dados� Os procedimentos de recu-
peração redo e undo são aplicados nesse contexto� 
O procedimento redo(Ti) identifica todos os itens de 
dados atualizados pela transação Ti e os define com 
os novos valores disponíveis no log�
Nesse procedimento, a ordem em que as operações 
são refeitas é importante, sob pena de se obter um 
valor incorreto para o item de dado� Por outro lado, o 
procedimento undo(Ti) realiza a restauração de todos 
os valores antigos dos itens de dados que foram 
impactados pela transação Ti�
Desfazer uma transação não implica somente res-
taurar os valores antigos dos itens de dados impac-
tados, mas implica também registrar no log todas 
as informações sobre o processo de undo� Quando 
a operação terminar, insere-se no log um registro do 
tipo: <Ti abort>, indicando a finalização do processo.
Para o caso de haver falhas, a decisão sobre quais 
transações devem ser refeitas e quais devem ser 
desfeitas é tomada a partir da consulta ao log�
Uma transação precisa ser desfeita no caso de ha-
ver o registro de <T start> no log mas não haver o 
32
registro de <T commit> ou <T abort>� Por outro lado, 
se o registro de <T start> estiver presente no log e 
o registro de <T commit> ou o registro de <T abort> 
também estiverem presentes, então a transação de-
verá ser refeita�
Uma alternativa ao registro em log de todos os es-
tados de um item de dado, durante a execução de 
uma transação, é realizar a atualização tardiamente� 
Nesse caso, todas as operações de escrita para o 
item de dado são adiadas até que a transação finali-
ze� O log não precisa conter os valores antigos para 
o item de dado em questão�
As atualizações tardias ou adiadas permitem que, 
havendo falhas, não seja necessário a reversão de 
nenhuma atualização, visto que elas não foram efe-
tivadas em disco� Porém,a abordagem da atualiza-
ção imediata necessita, em caso de falhas, que as 
operações realizadas sejam revertidas�
Quando temos transações muito longas, é possível 
que haja algum problema de desempenho do siste-
ma, visto que o processo de gravação em disco, das 
diferentes alterações promovidas pela transação, é 
lento�
Para evitar ter muitas alterações em disco, após 
a finalização de uma transação longa, utiliza-se o 
conceito de pontos de checagem ou checkpoints� 
Um checkpoint é uma entrada intermediária para as 
atualizações parciais em disco�
33
A utilização de checkpoints prevê a suspensão tem-
porária da execução da transação, a gravação em 
disco dos blocos de dados alterados na memória, 
registrar o checkpoint no log e transferi-lo para o ar-
mazenamento estável e seguir com a execução da 
transação�
Assim, a periodicidade com a qual os checkpoints 
são realizados pode seguir de acordo com critérios 
de tempo ou pelo número de transações efetivadas�
34
CONSIDERAÇÕES FINAIS
Neste módulo, estudamos os tipos de dispositivos 
de armazenamento de dados e em quais característi-
cas eles se diferenciam� Há dispositivos que podem 
armazenar quantidades diferentes de dados, ou seja, 
dispositivos que são adequados para o armazena-
mento massivo de dados, como é o caso das fitas 
magnéticas; e outros que recebem apenas alguns 
blocos de dados, como é o caso do cache�
Pudemos verificar que é diferente a velocidade de 
acesso aos dispositivos de armazenamento� Na me-
mória principal, por exemplo, a velocidade com a qual 
as operações são realizadas é maior do que a velo-
cidade das operações sobre os discos magnéticos�
Os discos magnéticos podem ser organizados de 
modo a possibilitar maior desempenho das opera-
ções e/ou aumentar a segurança dos dados em caso 
de perda de discos� Os níveis de RAID descrevem 
diferentes organizações de discos, visando a oferecer 
maior desempenho ou segurança ou a combinação 
de ambos� 
O desempenho das operações é obtido por meio do 
espalhamento do bloco de dados nos discos, e a 
segurança é o resultado do espelhamento dos dis-
cos� Além disso, podemos contar com a obtenção de 
dados de paridade, a partir da utilização de um algo-
ritmo específico para esse fim. Os dados de paridade 
são utilizados para a recomposição de discos que 
35
foram perdidos e ficam distribuídos entre os discos 
que compõem o sistema de discos�
O desempenho das operações sobre os arquivos de 
dados é relativo ao tipo de indexação que se pode 
utilizar. Verificamos que as estruturas de índices 
disponibilizam os valores-chave ordenados e asso-
ciados ao endereço de armazenamento do registro 
no disco�
Esses índices podem se apresentar na forma densa, 
quando para cada registro no arquivo há um valor-
-chave correspondente na estrutura de índices; ou 
na forma esparsa, que é possibilitada pelo ordena-
mento sequencial dos registros nos arquivos a partir 
do respectivo valor-chave�
Na forma esparsa, a estrutura de índices conta com 
alguns valores-chave que cobrem o intervalo de va-
lores, e a pesquisa por um valor é feita em um de-
terminado bloco de dados, apontado pela estrutura 
de índices�
Quando os registros no arquivo não apresentam uma 
ordenação sequencial a partir de um valor-chave, 
podemos utilizar uma estrutura de índices secun-
dários� Nesse caso, os valores-chave se associam 
a uma estrutura de ponteiros para os endereços de 
disco dos registros, os quais poderão ser acessados 
diretamente�
As funções hashing são uma alternativa ao uso das 
estruturas de índices e têm a vantagem de não ne-
cessitarem de qualquer tipo de busca para o mapea-
36
mento de um valor-chave no seu respectivo endereço 
no disco� 
A obtenção de uma função hashing deve seguir com 
o intuito de haver uma distribuição uniforme entre os 
buckets e de não haver qualquer associação entre os 
valores-chave e algum tipo de ordenação�
Por fim, discutimos diferentes formas de recuperação 
de banco de dados a partir de diferentes tipos de 
falhas� As falhas podem ter sua origem em transa-
ções malsucedidas, que devem ser identificadas e 
desfeitas ou refeitas, a depender do caso�
Assim, a definição das operações para a recuperação 
é feita a partir de um registro de log, que é o registro 
das operações que atualizam, de alguma forma, o 
banco de dados�
37
Referências Bibliográficas 
& Consultadas
BARRETO, J� S� ; ZANIN, A� ; MORAIS, I � S� ; 
VETTORAZZO, A� S� Fundamentos de segurança da 
informação� Porto Alegre: SAGAH, 2018 [Biblioteca 
Virtual]�
ELMASRI, R�; NAVATHE, S� B� Sistema de banco de 
dados� 6� ed� São Paulo: Pearson Addison-Wesley, 
2011 [Biblioteca Virtual]�
HEUSER, C� A� Projeto de banco de dados� 6� ed� 
Porto Alegre: Bookman, 2009� [Biblioteca Virtual]�
MANNINO, M� V� Projeto, desenvolvimento de apli-
cações e administração de banco de dados� 3� ed� 
Porto Alegre: AMGH, 2014 [Biblioteca Virtual]�
MEDEIROS, L� F� Banco de dados: princípios e prática� 
Curitiba: InterSaberes, 2013 [Biblioteca Virtual]�
MOLINARO, L� F� R� Gestão de tecnologia da infor-
mação: governança de TI: arquitetura e alinhamento 
entre sistemas de informação e o negócio� Rio de 
Janeiro: LTC, 2011 [Minha Biblioteca]�
OIKAWA, M� K� Sistemas de Banco de Dados – Notas 
de Aula� Universidade Federal do ABC - UFABC, 2012�
RAMARKRISHNAN, R� Sistemas de gerenciamento 
de banco de dados� 3� ed� Porto Alegre: AMGH, 2001 
[Biblioteca Virtual]�
SILBERSCHATZ, A�; SUNDARSHAN, S�; KORTH, H� F� 
Sistema de Banco de Dados� Elsevier Brasil, 2016�
WANDERLEY, A� R� M� C� Gerenciamento de servido-
res� São Paulo: Érica, 2019 [Biblioteca Virtual]�
	_GoBack
	INTRODUÇÃO
	ARMAZENAMENTO, INDEXAÇÃO E GERENCIAMENTO DE TRANSIÇÃO
	MEIOS DE ARMAZENAMENTO FÍSICO
	INDEXAÇÃO E FUNÇÕES HASHING
	Recuperação de falhas
	CONSIDERAÇÕES FINAIS
	Referências Bibliográficas & Consultadas

Continue navegando