Escolar Documentos
Profissional Documentos
Cultura Documentos
Resumo
A mudança para o Firebird pode ser desconcertante para desenvolvedores que já tenham
trabalhado com outros sistemas gerenciadores de bancos de dados. Na teoria, o banco de
dados relacional separa o projeto lógico de uma aplicação do armazenamento físico dos
dados, permitindo aos desenvolvedores concentrarem-se em quais dados eles querem
que suas aplicações acessem, ao invés de se preocupar em como os dados devem ser
recuperados. Na prática, o mecanismode cada sistema gerenciador de bancos de dados
realiza alguns tipos de acesso mais rapidamente do que os outros. Os desenvolvedores
geralmente aprendem os métodos de otimização que funcionam com o SGBD utilizado
por eles.
O Firebird suporta somente um tipo de índice: uma variação do b-tree. Índices podem
ser únicos ou permitir duplicidades; Eles podem ter uma chave simples ou composta,
ascendente ou descendente.
Como a estratégia de acesso amarra o acesso ao índice e aos registros, a maioria dos
otimizadores de banco de dados devem escolher um índice por tabela como caminho de
acesso ao dado. O Firebird pode usar diversos índices de uma tabela através de
operações de AND e OR nos bitmaps criados através dos índices, antes de acessar
qualquer dado.
Se você tem uma tabela onde vários campos diferentes são usados para restringir a
recuperação de dados de uma consulta, a maioria dos bancos de dados requer que você
defina um único índice que inclua todos os campos. Por exemplo, se você esta
procurando por um filme que foi feito em 1964, dirigido por Stanley Kubrick, e
distribuído pela Columbia, você precisará de um índice por Ano, Diretor e
Distribuidora. Se você sempre procura todos os filmes dirigidos por Stanley Kubrick,
você também precisará de um índice definido apenas pelo diretor, etc. Com o Firebird,
você poderia definir um índice por Diretor, um por Distribuidora e um por Ano, e eles
poderiam ser utilizados em várias combinações.
Alguns bancos de dados (Firebird 2 por exemplo) são melhores que outros (Firebird 1.x,
por exemplo) removendo dados de cadeias longas de duplicados (>10000) em índices.
Se você precisa de um índice de um campo com baixa seletividade para o banco de
dados Firebird 1.x, deveria criar uma chave composta pelo campo que você deseja
seguido de um campo mais seletivo. Por exemplo, se você tem um índice por
DataPagamento na tabela Contas, e todos os registros são armazenados com o valor null
quando a conta está em aberto, e então modificado quando a conta é paga, você deveria
criar um índice composto por DataPagamento e NumeroConta, ao invés de um índice
com um único campo DataPagamento.
1.1.8 Índices de custo de dados
SGBDs que não são baseados no versioning resolvem algumas consultas (counts por
exemplo) lendo o índice sem realmente ler os registros de dados. Índices no Firebird
(como no PostgreSQL e outros banco de dados nativamente versioning) contêm
entradas que não são ainda visíveis para outras transações e entradas que não são mais
relevantes para transações ativas. A única forma de saber se uma entrada no índice
representa o dado visível para uma transação em particular é lendo o registro.
O índice não tem informação suficiente para determinar quais entradas deveriam ser
contadas para responder uma consulta como: select count(*) from contas where
DataPagamento is not null.
Na versão Firebird 1.x, o tamanho total de uma chave de índice tem que ser menor que
252 bytes. Índices de chaves compostas e índices com uso de collation não binárias são
mais restritivos por razões descritas na seção Compactação da chave de índice. O
Firebird 2 permite chaves com até 1/4 do tamanho da página, ou um máximo de 4 Kb.
O Firebird converte todas as chaves de índice em um formato que pode ser comparado
por byte-wise. Com exceção dos campos inteiros de 64bit, todos os campos chave
numéricos e datas são armazenados como inteiros de precisão dupla, e os números de
precisão dupla são manipulados para serem comparados byte a byte. Quando
executando uma procura por índice, o Firebird converte o valor procurado para o
mesmo formato da chave armazenada. Para o desenvolvedor, isto significa que não
existe diferença básica de velocidade entre índices de strings, números e datas. Todos os
índices são comparados por byte-wise, sem levar em consideração seus tipos de dados
originais.
Considere o caso da chave com três campos com este conjunto de valores:
O Firebird versão 1.x faz a compactação de prefixo das chaves de índice enquanto elas
são armazenadas nas páginas de índices. Ele armazena a primeira chave em uma página
sem compactação de prefixo. As chaves subseqüentes são armazenadas depois de
substituídos os bytes principais que combinam com a mesma seqüência na chave prévia
por um simples byte contendo o número de bytes que foram saltados. As duas chaves
acima deveriam ser armazenadas desta forma:
Uma entrada de índice que combina perfeitamente com a entrada previa é armazenada
como um byte simples que contém seu tamanho. O Firebird 2 também realiza a
compactação de prefixo, mas usa uma representação mais densa.
Este documento foi escrito por Ann Harrison em Junho de 2005, e está sobre copyright
Srta. Harrison e IBPhonix. Você deve reproduzi-lo literalmente, incluindo esta
anotação. Você talvez atualize, corrija ou expanda o material, desde que você inclua a
notação do trabalho original foi produzido por Ms. Harrison e IBPhoenix, e a tradução
para o português foi feita por Gleison Gibellato da Silva e Moacir Flávio Gonçalves.
Essa versão do artigo teve a tradução ligeiramente modificada por Carlos H. Cantu.