Crear indices vía código

3,249 views
Skip to first unread message

Analyzer

unread,
Jan 10, 2014, 3:22:48 PM1/10/14
to mundovisualfoxpro
Leo esto en un manual de VFP:

Los índices principales aseguran que sólo se introducen valores únicos en un campo y
determinan el orden en el que se procesan los registros. Puede crear un índice principal para
cada tabla si la tabla está incluida en la base de datos. Si la tabla ya tiene un índice principal,
agregue un índice candidato. Este índice es el que define el campo clave.

Los índices candidatos también imponen valores únicos y determinan en qué orden se
procesan los registros, como un índice primario. Puede tener varios índices candidatos por
tabla en bases de datos y en tablas libres.

Los índices normales determinan el orden en que se procesan los registros pero permite que se
introduzcan valores duplicados en un campo. Puede agregar más de un índice normal a una
tabla. Es muy útil ya la mayoría del tipo índices normales.

La ayuda de VFP indica esta sintaxis:

INDEX ON eExpression TO IDXFileName | TAG TagName [BINARY]

   [COLLATE cCollateSequence] [OF CDXFileName] [FOR lExpression]

   [COMPACT] [ASCENDING | DESCENDING] [UNIQUE | CANDIDATE] [ADDITIVE]


El ejemplo que trae la ayuda dice:

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'Data\TestData')

USE Customer     

INDEX ON company TAG company 

INDEX ON address TAG address

CLEAR

DISPLAY STATUS

Leo en la web que no se pueden crear indices principales via código. Es eso cierto?..

Porque en la ayuda en el tema:How to: Create Indexes (Visual FoxPro) trae estos ejemplos:

ALTER TABLE Customer ADD PRIMARY KEY Cust_ID TAG Cust_ID
ALTER TABLE Customer ALTER COLUMN Cust_ID c(5) PRIMARY KEY

¿Entonces si se puede crear un índice principal via código o no?


Entiendo que el principal solo puede haber uno y los candidatos muchos y solo aceptan valores que no se repitan. ¿Es así?

Mientras que el "indice normal" si acepta duplicados.

Al hacer el típico INDEX ON company TAG company que hacemos todos, cuál de esos tres índices se creó?.. Principal, candidato o normal?..

Pueden poner un ejemplo de cómo crear los 3 ?


Saludos!

Alex Field

unread,
Jan 10, 2014, 7:14:26 PM1/10/14
to mundovis...@googlegroups.com
si se puede crear por código un indice primario

ALTER TABLE prueba ADD PRIMARY KEY dummy TAG dummy

pero esta tabla tiene que estar dentro de un contenedor de base de datos.

si índices principal hay uno

con el index on tradicional INDEX ON company TAG company
creas un indice normal

ALTER TABLE prueba ADD KEY dummy TAG dummy
ALTER TABLE prueba ADD UNIQUE KEY dummy TAG dummy (candidato)
ALTER TABLE prueba ADD FOREIGN KEY dummy TAG dummy (normal)

Analyzer

unread,
Jan 12, 2014, 10:56:33 PM1/12/14
to mundovisualfoxpro
Gracias Alex, por aclarar todas mis dudas. 

Muy agradecido..


Saludos!


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Carlos Miguel FARIAS

unread,
Jan 13, 2014, 6:28:12 AM1/13/14
to mundovisualfoxpro
Un foreign key no crea un indice normal, ya que va asociado a otra tabla (y el fox incluye SP para manejarlo).
No hay que confundir el UNIQUE del ALTER TABLE, que crea un indice candidato del UNIQUE que se crea con el INDEX ON.


INDEX ON eExpression TO IDXFileName | TAG TagName [BINARY]
   [COLLATE cCollateSequence] [OF CDXFileName] [FOR lExpression]
   [COMPACT] [ASCENDING | DESCENDING] [UNIQUE | CANDIDATE] [ADDITIVE]
Si se fijan en el comando INDEX ON, diferencia UNIQUE de CANDIDATE.
El Indice candidato, no permite que la expresión del indice tenga duplicados, en cambio un indice UNIQUE (del index on) permite valores duplicados pero solo indexa el primero que encuentra, entonces.

Clave   CANDIDATE   UNIQUE
11001    Indexa      Indexa
11002    Indexa      Indexa
11002    Da Error    NO Indexa
11003    Indexa      Indexa


Si uds recorren la tabla con el indice unique activo, los registros no indexados son salteados. Eso debe tenerse en cuenta porque puede producir errores en el procesamiento.
y recuerden que conviene hacer los indices lo más corto posibles (eso es válido para cualquier SGBD). Ya que todos utilizan en general una estructura B tree (o B+) para indexar y cuanto más corto el indice, mas nodos entran por pagina de indice (nodo) y la velocidad de acceso mejora sustancialmente.
Asumiendo una página de 500 bytes, y 4 bytes por puntero a datos, una clave de 16 bytes mete hasta 25 claves por nodo (página).
En una tabla de 35000 registros, encuentra los datos en 4 intentos, si la clave fuese de 11 bytes los encuentra en 3 intentos.
Eso es algo asi como 25% menos de tiempo.
En el caso particular de VFP, cualquier indice numérico ocupa 8 bytes de clave, por lo que conviene convertir a cadena de caracteres si el campo numérico tiene menos de 8/9 dígitos, si el número es entero se usan BINTOC y CTOBIN (ver ayuda) ya que de esa manera la clave ocupa solo 4 bytes (por omisión)
Con vfp 9 se tiene otras opciones (ver ayuda).
Saludos: Miguel, La Pampa (RA)

Analyzer

unread,
Jan 13, 2014, 3:10:32 PM1/13/14
to mundovisualfoxpro
Gracias CMF! Por compartir su experiencia en estos temas.


Saludos!
Reply all
Reply to author
Forward
0 new messages