En la vieja escuela se sujerian 6 reglas para establecer como diseñar y optimizar todo el manejo de datos.
1) Volumen de Datos: Una vez definidos los datos a almacenar, Reducir al maximo el volumen que los mismos ocuparan en el medio de almacenamiento o que deberá ser transmitido, ya sea por normalización, si no y tan o mas importante por tipo de datos y dimensionamiento de los datos en aquellos sistemas que es posible. Por ejemplo usar enteros de tamaño apropiado, lo mismo para campos númericos, campos de texto, etc. Y al consultar los datos, solo transferir los datos realmente necesarios en cada momento. Por ejemplo evitar SELECT * FROM ...
En los SGBD que lo soportan, los campos varchar en lugar de los character, permiten reducir el volumen de datos transferido.
A partir de aqui, se aplican los criterios bajo la pauta de que las posibilidades que se tienen se vayan descartando las que no funcionan según cada criterio.
2) Frecuencia y Modo de Uso: Si la frecuencia de uso es baja, no me preocupo de los factores de optimización de la consulta, a medida que se incrementa la frecuencia de acceso, tendré que preocuparme de optimizar el acceso. Ejemplos: Con muy alta frecuencia de acceso, podría pensar en transferir ciertos archivos al equipo local, o almacenarlos en memoria del cliente, de manera de que no circulen por la red, o ciertos archivos usarlos con acceso directo (esto se puede hacer solo con nativas y pocos sgbd) usando go record en lugar de indices.
En cuanto al modo de uso, no es lo mismo acceso al azar, que acceso secuencial. El acceso al azar, es mejor acerlo a traves de claves primarias, y en el caso de join entre tablas, podría ser necesario un indice sobre la clave foranea pero solo del lado muchos. En los accesos secuenciales (listado de clientes) puede ser conveniente crear indices sobre por ejemplo como suena (soundex) que son cadenas de pocos bytes por lo tanto, con el mismo resultado, se obtiene un indice mas chico (y este indice se justifica si la frecuencia de uso de dicho listado es alta).
3) Datos Estáticos o Dinámicos: Si los datos son extremadamente estáticos, a veces, conviene (si el volumen lo permite) tenerlos codificados en "duro" dentro del codigo. En otros casos, podrian estar en archivos locales del equipo cliente o en formato comprimido, que se carga al arrancar la aplicacion. Además los datos en esto casos, ya pueden estar ordenados fisicamente en el orden de uso, lo que lo hace mas eficiente todavia.
A medida que los datos se hacen más dinámicos (o sea, se modifican mas frecuentemente), tendrá que analizarse por separado como influyen las altas, los cambios y las bajas. Todas tienen problematicas diferentes.
Las altas masivas, si hay muchos indices activos, son mortales para el desempeño. Por ejemplo en VFP, el uso de autoincrementales propios (VFP8 y 9) es por si mismo hasta una 35% más lento.
Por ejemplo el append blank en nativas, es muchismas veces mas lento que el inser into, razon? muy simple. un append blank (sin buffer), carga un registro en blanco, por lo que cada indice primero se actualiza con datos "en blanco" y luego cada indice se actualiza los respectivos valores.
Además el append blank, puede crear conflicto en entorno multiusuario si dos o + a la vez intentan un append blanck, el segundo le da clave duplicada en primarias y candidatas.
En el caso de los cambios, si los datos que se cambian no corresponden a columnas indexadas, no hay problema con la cantidad de indices, pero si se modifican columnas correspondientes a indices, agarrate Catalina.
En el caso de las bajas, dependera de si son nativas o no. En los sgbd, una baja es definitiva (delete incluye pack), en estos un borrado lógico (como el de los xbase), debe hacerse modificando una columna de estado. Si los registros deben eliminarse fisicamente, en fox ya sabemos de la necesidad de uso exclusivo de tablas y luego el pack, en los sgbd, conviene el borrado logico (marcado de registro) y luego, en horarios de poca carga, hacer eliminación fisica.
Los sgbd no tienen problemas con tablas exclusivas, pero pueden bloquear el sistema y siempre un borrado, afecta todos los indices de la tabla.
4) Este criterio corresponde a la estructura de datos a utilizar (una vez que desechamos todas las que no son aplicables por los criterios anteriores) y por logica, para acceso secuencial, si los datos necesarios ya estan ordenados mejor, en acceso al azar, si puedo acceso directo (por número de registro o acceso hash), si no, indices primarios, u otros indices, si hay disponibles. Siempre que se crean indices, que estos sean lo mas chicos posibles.
Por ejemplo, en fox, los indices sobre columnas numericas, no importa su tamaño, se crea como una clave numerica de 8 bytes binarios. Entonces, si mis valores de clave son mas chicos, conviene convertilos a texto binario (BINTOC y CTOBIN). Eso reduce el tamaño del indice, y por lo tanto, el acceso mejora.
5) Este criterio indica que si nos quedan 2 o más estructuras que no hayan sido descartadas por los criterios anteriores, tendremos que elegir la más rápida.
6) Por ultimo, si todavia queda mas de una estructura potable, aplicaremos el criterio de la mas facil de programar.
Algunos pueden plantear que estos criterios son "muy viejos", pero siempre por ahi se escucha que los sistemas están lentos, pasa de que cada vez se manejan mayor cantidad de datos que saturan la red (contables, financieros, imagenes de productos, datos dactilares, correo electronico, chat, señal de radio, fotos pornos

, etc.)
Saludos: Miguel, La Pampa (RA)