Os registros de uma tabela encontram-se normalmente dispostos aleatoriamente, uma vez que a ordem das linhas é a ordem de inserção dos registros. A numeração do registro indica apenas a ordem de inserção dos registros. Entretanto, em um dado momento, pode ser necessário a ordenação dos dados em função de algum campo como: nome, idade, salário etc.
Dado que a ordenação de uma tabela em relação a um determinado campo pode ser um processo demorado (no caso de muitos registros), o dBASE II utiliza-se de um recurso para otimizar esse processo: a indexação.
Os índices são estruturas de acesso auxiliares adicionais, usadas para acelerar a recuperação de registros em resposta a determinadas condições de pesquisa. As estruturas de índice são arquivos adicionais no disco que fornecem caminhos de acesso secundário, como forma alternativa de acessar os registros sem afetar a colocação física dos registros no arquivo de dados primários do disco [1].
A principal vatangem de ter um campo ordenado pelo índice é que a busca pelo campo ordenado é muito mais rápida do que a busca sequencial.
O comando INDEX cria um índice para uma determinada tabela. Sintaxe:
INDEX on <campos> to <nome_indice>
Exemplo de indexação utilizando a tabela alunos, ordenado pelo nome.
. use alunos . index on nome to alunos
Ao criar o índice, a tabela indexada já entra em uso.
. display all 00004 8437 Alvaro Schwarz 12 M 5 00002 4321 Ana Maria Silva 11 F 5 00005 7193 Beatriz Saraiva 13 F 6 00006 3398 Mauro Pontes 11 M 5 00001 8361 Pablo Goncalves 11 M 5 00010 7766 Paula Tavares 13 F 6 00009 6201 Pedro Borges 11 M 5 00007 9001 Pedro Tavares 13 M 6 00008 6567 Suely Albuquerque 12 F 6 00003 5543 Waldir Moraes 12 M 6
Para abandonar o uso da tabela indexada, colocamos a tabela alunos em uso:
. use alunos
Para retornar o índice:
. set index to alunos
Para ativar a tabela juntamente com o índice índice criado, damos o seguinte comando:
. use alunos index alunos
O dBASE II cria um novo arquivo no formato ".ndx". No caso da indexação acima, o arquivo "alunos.ndx" foi criado.
Vamos dar uma olhada em parte do arquivo criado.
+-------+-------------------------------------------------+------------------+ | End. | Valores hexadecimais | Valores ASCII | +-------+-------------------------------------------------+------------------+ | 00200 | 0a 00 0004 00 41 6c 76 61 72 6f 20 53 63 68 77 | .....Alvaro Schw | | 00210 | 61 72 7a 20 20 20 20 20 20 20 20 20 20 20 20 20 | arz | | 00220 | 20 20 20 00 0002 00 41 6e 61 20 4d 61 72 69 61 | ....Ana Maria | | 00230 | 20 53 69 6c 76 61 20 20 20 20 20 20 20 20 20 20 | Silva | | 00240 | 20 20 20 20 20 00 0005 00 42 65 61 74 72 69 7a | ....Beatriz | | 00250 | 20 53 61 72 61 69 76 61 20 20 20 20 20 20 20 20 | Saraiva | | 00260 | 20 20 20 20 20 20 20 00 0006 00 4d 61 75 72 6f | ....Mauro | | 00270 | 20 50 6f 6e 74 65 73 20 20 20 20 20 20 20 20 20 | Pontes | +-------+-------------------------------------------------+------------------+
Observando a listagem ordenada após o comando DISPLAY ALL mais acima, notamos que os valores dos índices (coluna mais à esquerda) para o Alvaro, Ana Maria, Beatriz e Mauro correspondem aos bytes marcados em vermelho na visualização do arquivo "ndx". Assim, quando desejamos retornar informações sobre a Beatriz, o programa realiza uma busca rápida (busca binária, árvore B etc) na lista de nomes já ordenada e depois identifica o índice 05 para esta pessoa. Conhecendo a localização do registro da Beatriz, ele vai direto para ele no arquivo, sem ter a necessidade de varrer todo o arquivo de dados.
O comando FIND busca por um registro, por meio do campo utilizado na indexação (ordenação). No exemplo anterior, o campo utilizado foi o nome.
O valor da string passada é sem aspas, conforme o exemplo a seguir.
. find Pedro . display 00009 6201 Pedro Borges 11 M 5
É possível utilizar mais de um campo para criar a indexação. Para isso, utilize o operador mais "+" para separar os nomes dos campos. Entretanto, os campos deverão ser no formato de caractere. Caso um ou mais campos estejam no formato numérico, devemos utilizar a função
str(numero, tamanho, decimal)
para converter os números para caracteres. Exemplo:
. index on str(idade,2) + nome to aluidx
Salva em um novo índice chamado "aluidx.ndx".
Listando a tabela indexada, onde a ordem é primeiro a idade, depois o nome, temos:
. display all 00002 4321 Ana Maria Silva 11 F 5 00006 3398 Mauro Pontes 11 M 5 00001 8361 Pablo Goncalves 11 M 5 00009 6201 Pedro Borges 11 M 5 00004 8437 Alvaro Schwarz 12 M 5 00008 6567 Suely Albuquerque 12 F 6 00003 5543 Waldir Moraes 12 M 6 00005 7193 Beatriz Saraiva 13 F 6 00010 7766 Paula Tavares 13 F 6 00007 9001 Pedro Tavares 13 M 6
É importante observar que a ordenação dos campos é feita na ordem que os campos aparecem. No exemplo anterior, primeiramente foi ordenado o campo idade, depois o campo nome.
Obs: o comando REINDEX atualiza o índice em uso, caso a tabela original tenha sido alterada.
O comando SORT tem o objetivo de ordernar um arquivo através de um campo selecionado e salvar o resultado em outro arquivo.
Sintaxe:
SORT on <campo> to <arquivo> [ASCENDING] ou [DESCENDING]
Onde:
Exemplo para o arquivo alunos:
. use alunos . sort on nome to aluord
O comando SORT ordena por padrão de forma crescente (ASCENDING). Para ver o resultado final, fazemos:
. use aluord . display all 00001 8437 Alvaro Schwarz 12 M 5 00002 4321 Ana Maria Silva 11 F 5 00003 7193 Beatriz Saraiva 13 F 6 00004 3398 Mauro Pontes 11 M 5 00005 8361 Pablo Goncalves 11 M 5 00006 7766 Paula Tavares 13 F 6 00007 6201 Pedro Borges 11 M 5 00008 9001 Pedro Tavares 13 M 6 00009 6567 Suely Albuquerque 12 F 6 00010 5543 Waldir Moraes 12 M 6
A ordenação feita através do comando SORT não cria um índice. A operação apenas gera um novo arquivo ordenado através do campo selecionado. Dessa forma, a busca pelo campo ordenado não terá as vantagens da indexação, a menos que criemos um índice para essa nova tabela.
Referências:
[1]- Fundamental of Database Systems, 7th Edition. Elmasri & Navathe, Person, 2016.
<< Anterior | dBASE II | Próxima >> |