Conceitos Fundamentais em Sistemas de Bancos de Dados e suas

Propaganda
Administração de Banco de Dados – Aula 2
Agora vamos falar de índices .
O que são índices ???
Imagine você procurar algum conhecido num condomio com diversos apartamentos
por andar e sem poder consultar uma lista , em ordem alfabética, pelo nome de cada
morador. Você teria que procurar o seu conhecido , andar por andar , apartamento
por apartamento.
Pois é o SQL permite criar lista indexadas , isto é em ordem alfabética ou numérica
para um ou mais campos de uma tabela.
Para cada índice criado , são também criados arquivos de índices com ponteiros para
o arquivo principal.
Alguns softwares de banco de dados , pemitem que estes arquivos de índices sejam
armazenados num outro disco , diferente de onde foram armazenadas as tabelas
principais . Isto possibilita deixar um disco exclusivo para índices , com o objetivo de
poder obter mais performance.
Matricula
5555
1111
6666
2222
Nome
Jose Pereira
Ana Lima
Maria Santos
Jorge Gomes
Estado
SP
RJ
SP
SP
Cidade
SÃO PAULO
RIO DE JANEIRO
CAMPINAS
SANTOS
Se for criado um índice em matricula , o arquivo de índice ficara com esta imagem
Matricula
1111
2222
5555
6666
Numero do
Registro da tabela
principal
2
4
1
3
O Numero do Registro da tabela principal é o ponteiro para a tabela principal.
Este arquivo de índices só contem as colunas do índice , que podem ser composta por
mais de uma coluna e a coluna do ponteiro e é este arquivo de índice que sempre é
reorganizado e não mais a tebela principal
Quando usamos a chave primária , a tabela fica sempre reorganizada pelos campos
que compõe o índice e portanto tem a vantagem de num acesso SELECT ser mais
rápido por não ter que percorrer o arquivo de índices , porem o processo de inserção ,
exclusão e alteração que envolve um campo chave , acaba sendo mais lento , pelo fato
de ter que ser feita a reorganização.
Cada vez que for inserido , alterado ou excluído um registro que contem índices , o
SQL vai reorganizar a tabela de índices e portanto pode gastar mais tempo em cada
atualização , fora o espaço em disco que é consumido para cada arquivo. Os arquivos
de índices não ficam visíveis para os usuários e são gerenciados pelo SGBD e são
criados um arquivo para cada índice , associado a tabela origem.
Para que sejam minimizadas as reorganizações nos arquivos índices , o software de
banco de dados (SGBD) permite que o DBA interfira dizendo o quanto de registros
vazios deseja que a tabela de índices fique.
Matricula
Numero do
Registro da tabela
principal
1111
2
2222
4
5555
1
6666
3
Estes buracos , no arquivo de índice são criados através da opção que existe no
comando de criação de índices . No caso do SQL server , ele tem o nome de FILL
FACTOR , onde é definido um percentual de buracos.
Quanto menos buracos , FILL FACTOR com zero , a consulta fica mais rápida , com
um Fill Factor maor , serão favorecidos os módulos de a inserção , exclusão e
alteração.
Acesso aos Dados
O SQL Server acessa os dados de dois métodos.
- Examinando todas as páginas de dados das tabelas – chamado de exame de tabela
ou TABLE SCAN (varredura da tabela inteira)
Ao executar um exame de tabela o SQL Server:
• Começa no inicio da tabela.
• Examina todos os registros da tabela, página a página.
• Extrai os registros que satisfazem os critérios da consulta.
- Usando índices. Ao usar um índice, o SQL Server:
• Percorre a estrutura da árvore do índice para localizar os registros solicitados pela
consulta.
• Extrai apenas os registros necessários que satisfazem os critérios da consulta
Como Criar Índices?
Ao criar índices, leve em conta dois fatores: a natureza dos dados e a natureza das consultas
realizada nas tabelas.
Natureza dos dados – Quando me refiro a natureza de dados, sempre levo em conta o tipo
da coluna em que colocarei um índice, é recomendável que índices estejam em colunas do
tipo: int, char, bigint, tinyint, smallint e datetime.
Natureza das consultas – As naturezas das consultas se referem em qual campo da minha
tabela devo criar um índice, exemplo: Imagine um cenário que tenho que criar uma
consulta que traga os pedidos emitidos por data de emissão e que a situação seja somente
os pedidos liberados. Naturalmente na minha tabela de pedidos eu teria o campo data de
emissão e situação do pedido. Essas são colunas aconselháveis para a criação de índices.
Os índices são úteis, porém consomem espaço em disco e acarretam custos de manutenção
e sobrecarga. Não crie um índice que não será usado com freqüência.
Índice Clustered ou Agrupamento
Esse tipo de índice é útil para as colunas pesquisadas com freqüência ou em busca de chave
de valores. Ao criar um índice desse tipo, considere as seguintes diretrizes:
• Cada tabela só pode ter um índice clustered.
• A ordem física dos registros da tabela e a ordem dos registros do índice são iguais.
Primeiramente é aconselhável que seja criado o indice clustered antes do índice não
clusterizado.
• Quando um registro é excluído, o espaço é restaurado e torna-se disponível para outro
registro.
• Quando se cria uma coluna como PRIMARY KEY, automaticamente essa coluna torna-se
um índice clustered.
• O tamanho médio de um índice clustered é aproximadamente 5% do tamanho da tabela.
No entanto, esse tamanho varia dependendo do tamanho da coluna indexada.
Índice No-Clustered ou Sem Agrupamento
Um índice não clusterizado é eficiente quando os usuários precisam de vários critérios de
pesquisa. Por exemplo, um vendedor pode pesquisar na tabela de pedidos pelo número do
pedido, data de emissão, cliente e o representante deste cliente. Ao criar um índice não
clusterizado, considere os seguintes fatos:
• A ordem das páginas no nível folha se um índice não clusterizado é diferente da ordem
• Pode existir até 249 índices não clusterizado por tabela.
• O SQL Server recria automaticamente os índices não clusterizados existentes quando
ocorre uma das situações a seguir:
• Um índice clustered é criado.
• Um índice clustered é descartado.
• A opção DROP_EXISTING é usada para alterar as colunas que definem o índice de
agrupamento.
Colunas que devem ser indexadas.
Crie índices em colunas pesquisadas com freqüências como:
• Chaves primárias (PK).
• Chaves externas (FK) ou colunas usadas frequentemente para unir tabelas.
• Colunas pesquisadas para a localização de faixa de valores de chave. (quando usamos a
clausula IN, NOT IN, BETWEEN).
• Colunas acessadas na ordem de classificação (ORDER BY)
• Colunas usadas durante a agregação. (GROUP BY)
Colunas que NÃO devem ser indexadas.
Não referencie colunas que:
• Raramente são usadas em um consulta.
• Colunas que retornam uma grande quantidades de dados , por exemplo um SELECT com
Where de intervalo entre datas muito espaças.
• Contenham poucos valores únicos. Por exemplo, um índice em uma coluna com dois
valores, Masculino e feminino, retorna uma alta porcentagem de registros.
• Sejam definidas com os tipos de dados text, ntext, varchar e image. Não é possível
indexar colunas com esses tipos de dados.
Criando índices.
Ao criar índice em uma tabela considere os fatos:
• Você deve ser proprietário da tabela.
• Quando se cria uma constraint do tipo PRIMARY KEY e UNIQUE, automaticamente o
SQL Server cria índices clustered para elas.
• Você pode criar índices em VIEWS
• Você não pode criar índice em colunas que já existam os mesmos.
• Você pode criar índice na hora de criação de sua tabela.
Sintaxe:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX nome_indice ON tabela (nome_coluna1 [, nome_coluna2, ...n])
[WITH
[PAD_INDEX]
[[,] FILLFACTOR = fator_preenchimento]
[[,] IGNORE_DUP_KEY]
[[,] DROP_EXISTING]
[[,] STATISTICS_NORECOMPUTE]
]
on
CREATE NONCLUSTERED INDEX nomeDoIndice ON Tabela(CampoIndexado)
Em um de meus artigos anteriores eu mostrei a criação de tabelas para um e-commerce, e é
exatamente em uma dessas tabelas que criaremos o índice.
Na prática:
CREATE NONCLUSTERED INDEX IdxEmpresaID ON DptoEmpresa(EmpresaId)
Apagando índice
Ao apagar um índice você deve levar em conta as seguintes diretrizes:
• Você não pode apagar os índices criados pelas restrições PRIMARY KEY e UNIQUE.
• Você não pode apagar os índices das tabelas do sistema.
• Você deve está no banco que reside o índice para apagá-lo.
Sintaxe:
DROP INDEX Tabela.NomeDoIndice
Na prática:
DROP INDEX DptoEmpresa.IdxEmpresaID
Até a próxima e espero que todos tenham gostado.
Download