Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Índices
Message
Information générale
Forum:
Visual FoxPro
Catégorie:
Base de données, Tables, Vues, Index et syntaxe SQL
Titre:
Divers
Thread ID:
00607641
Message ID:
00607754
Vues:
26
Rodolfo,

Pegando uma "carona" na FAQ do Hilmar, compilei algumas colocações que fiz na FoxBrasil sobre questões relacionadas (em português é claro) ;-)


Obrigado por compartilhar com os colegas estas informações. Só a título de
comentário: o índice sobre DELETED() pode ser uma armadilha. Veja só: O
índice sobre DELETED() será criado sobre um valor lógico (.T. para DELETED()
e .F. para NOT DELETED()). Este é um tipo de índice de baixa granularidade
(só dois valores possíveis). Ocorre que a estrutura interna dos índices no
VFP é uma árvore b-tree. Desta forma Se você não tiver um conjunto de
valores balanceados de registros DELETED() e NOT DELETED(), as suas
consultas podem demorar muito mais do que demorariam caso o índice
simplesmente não existisse. Exemplificando: se você tem uma tabela com
1.000.000 de registros e 500.000 são deletados e 500.000 não, a árvore
interna da extrutuda do índice seria meio assim:
          O
         D N
        D   N
       D     N
      D       N
     D         N
    D           N
e assim vai...

Se desses 1.000.000 de registros você tivesse 3 deletados e 999.997 não
deletados, a árvore seria desta forma:
          O
         D N
        D   N
       D     N
              N
               N
                N
                 N
                  N
                   N
                    ...
Ou seja, totalmente não-balanceada.
Se você notar, essa árvore quase não presta para nada quando é necessário
achar um registro não deletado. É quase como se não houvesse um índice.

Por isso, temos que ficar atentos à criação de indices sobre valores com
pouca granularidade.

É só um comentário...






Imagine os exemplos seguintes:

*** USE Clientes

O comando USE irá ler o cabeçalho do DBF e determinar se existe algum
arquivo de índice estrutural (CDX) e campos memo. Se existe um arquivo CDX,
o CABEÇALHO do CDX (que contém as definições das Tags) será trasferido para
a estação. Se existem campos Memo ou General, o FPT é aberto também. O
primeiro registro da tabela de Clientes é transferido juntamente com os
segmentos do arquivo FPT correspondentes a este registro.

*** SELECT * FROM Clientes WHERE Codigo = 1 INTO CURSOR Teste

Ao executar o SELECT, o CDX é examinado para determinar se existem TAGs que
podem ser usadas para identificar os regitros do DBF que atendam aos
critérios de seleção; no caso do exemplo acima, o Fox verificaria se existe
uma TAG baseada no campo "Codigo". Se existe tal TAG, os segmentos do
arquivo CDX requeridos para construir um mapa de registros para o referido
TAG seriam também transferidos para a estação (Os índices do VFP usam uma
árvore b-tree e um esquema de índices bitmap). O resultado do processamento
da TAG indicaria quais "pedaços" do arquivo DBF deveriam ser transferidos
através da rede para a estação.
Veja o que foi transferido para a estação até este momento:
- Os cabeçalhos dos arquivos;
- Alguma porção do arquivo CDX necessária para montar o mapa do índice para
a TAG em questão;
- Somente as porções do arquivo DBF que satisfazem a consulta;
- Se existissem campos MEMO, as porções do arquivo FPT para os quais o DBF
aponta.

Obs.: Se não existisse um CDX --OU-- não existissem TAGs úteis à consulta no
CDX, o conteúdo da tabela seria realmente transferido na íntegra e toda ela
seria avaliada na estação a fim de satisfazer à consulta, visto que não
existe outra forma de identificar quais registros satisfazem a condição sem
que eles sejam examinados um por um.
-----
Fabio Vazquez
http://www.fabiovazquez.com
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform