Curso de dBASE II
Indexação


Você está em: MarMSX >> Cursos >> dBASE II

7. Indexação

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.

7.1. O comando INDEX

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 00 04 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 00 02 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 00 05 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 00 06 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.

7.2. O comando FIND

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

7.3. Indexação múltipla

É 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.

7.4. Ordenação através do comando SORT

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 >>