Optimizar tablas e índices
Puede agilizar el acceso a datos de tablas mediante índices y almacenamiento en búfer de forma eficaz. Además, puede usar la tecnología Rushmore para optimizar las consultas.
Usar índices
El uso de índices permite agilizar el acceso a los datos de una tabla. Si se agrega un índice a una tabla se agilizan las búsquedas, especialmente si se puede utilizar la tecnología Rushmore para optimizar la búsqueda. El uso de índices también permite trabajar con los datos en un orden determinado, como ver una tabla de clientes ordenada por apellido.
Si los registros de una tabla tienen claves únicas, cree un índice principal o candidato en el campo. Estos tipos de índice permiten que Visual FoxPro valide la clave en un nivel inferior, con lo que se consigue el máximo rendimiento.
Además de usar índices en los campos utilizados para buscar y ordenar, también debería indizar todos los campos relacionados con una combinación. Si combina dos tablas en campos que no están indizados, la operación de combinación puede tardar mucho más tiempo en realizarse.
Una característica importante de Visual FoxPro es que puede crear un índice en cualquier expresión. (En algunas bases de datos sólo puede indizar los campos). Esta capacidad permite usar índices para optimizar las operaciones de búsqueda, ordenación o combinación en conjuntos de campos o en expresiones derivadas de campos. Por ejemplo, puede crear un índice de un campo de nombres basado en una expresión que use la función SOUNDEX( ). De esa manera, la aplicación puede proporcionar un acceso muy rápido a los nombres que guarden un cierto parecido.
Al agregar índices a las tablas, debe ver si la mejora en los tiempos de recuperación compensa la pérdida de rendimiento al actualizar la tabla. A medida que agregue más índices a la tabla, las actualizaciones e inserciones en la tabla se ralentizarán porque Visual FoxPro necesita actualizar cada índice.
Por último, evite el uso de índices en campos que contengan sólo unos cuantos valores discretos, como los campos lógicos. En estos casos, el índice sólo contiene un pequeño número de entradas y el trabajo de mantener el índice probablemente sea mayor que la ventaja que se consigue a la hora de realizar búsquedas.
Para obtener detalles acerca de la forma de crear índices de forma eficaz al usar la tecnología Rushmore, vea Usar Rushmore para agilizar el acceso a los datos.
Optimizar combinaciones
Cuando vaya a crear combinaciones mediante SELECT - SQL, las situaciones siguientes pueden reducir el rendimiento y producir resultados imprevistos:
- Combinación de tablas en datos que no sean una clave principal o única en una de las tablas.
- Combinación de tablas que contengan campos vacíos.
Para evitar estas situaciones, cree combinaciones que se basen en la relación entre las claves principales de una tabla y las claves externas de la otra. Si crea una combinación basada en datos que no sean únicos, el resultado final puede ser el producto de las dos tablas. Por ejemplo, la instrucción SELECT - SQL siguiente crea una combinación que puede producir un resultado muy extenso:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.postal_code = Orders.postal_code
En el ejemplo, el código postal identifica de forma exclusiva una ubicación en una ciudad, pero tiene poco valor si lo que pretende es establecer una correspondencia entre las filas de clientes y las filas de sus pedidos. El código postal no identifica necesariamente a un cliente o a un pedido de forma exclusiva. En su lugar, cree una combinación con una instrucción como la siguiente:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id
En este ejemplo, el campo customer_id
identifica de forma exclusiva a un cliente determinado y a los pedidos que pertenecen a ese cliente y, por tanto, crea un conjunto de resultados que combina la fila de clientes con cada fila de pedidos.
Además, tenga cuidado al combinar tablas que tengan campos vacíos porque Visual FoxPro establecerá una correspondencia con los campos vacíos. Sin embargo, no establece una correspondencia con los campos que contengan valores NULL. Al crear una combinación, califique las expresiones del campo en la condición de combinación, comprobando si hay una cadena vacía.
Por ejemplo, si piensa que el campo de identificación del cliente de la tabla Orders podría estar vacío, use una instrucción como la siguiente para filtrar los registros de pedidos que no tengan número de cliente:
SELECT *;
FROM tastrade!customer INNER JOIN tastrade!orders ;
ON Customer.customer_id = Orders.customer_id;
WHERE tastrade!orders <> ""
Sugerencia También puede probar una cadena vacía con la función EMPTY( ), pero la inclusión de una llamada a la función dentro de la expresión de filtro no resulta tan rápida como efectuar una comparación con un valor constante.
Usar el Administrador de proyectos
Cuando use el Administrador de proyectos, puede combinar un número ilimitado de programas y procedimientos en un solo archivo .app o .exe. Con esto se aumenta considerablemente la velocidad de ejecución del programa por varias razones.
En primer lugar, Visual FoxPro abre un archivo de programa y lo deja abierto. Después, cuando se ejecuta un comando DO en un programa contenido en el archivo, Visual FoxPro no necesita abrir un archivo adicional.
En segundo lugar, una aplicación de uno o dos archivos reduce el número de archivos necesarios en el directorio de trabajo. La velocidad de todas las operaciones del archivo aumentará a medida que el sistema operativo tenga menos entradas de directorios que examinar al abrir, cambiar el nombre o eliminar archivos.
Para obtener más información acerca del uso del Administrador de proyectos para crear aplicaciones, vea Compilar una aplicación.
Sugerencias generales para la optimización de tablas e índices
Para crear tablas e índices de la forma más rápida posible, siga las recomendaciones que se muestran a continuación.
- Si no está habilitado el almacenamiento de registros o tablas en búfer, use INSERT - SQL en lugar de APPEND BLANK seguido por REPLACE, especialmente con una tabla indizada en un entorno multiusuario, ya los índices deben actualizarse una sola vez.
- Si necesita anexar un gran número de registros a una tabla indizada, quizá sea más rápido quitar el índice, anexar los registros y después volver a crear el índice.
- En las instrucciones SQL, evite las llamadas a funciones en la medida de lo posible, especialmente en instrucciones que devuelvan más de un registro, porque la instrucción debe volverse a evaluar (lo que implica una nueva llamada a las funciones) para cada registro. Si crea una instrucción SQL con datos variables, use las expresiones de nombre o la sustitución de macros en lugar de la función EVALUATE( ). Una estrategia aún mejor es crear toda la instrucción de forma dinámica, no en cláusulas individuales. Para obtener más información, vea Utilizar macros y Creacíón de expresiones de tipo Name.
- Si suele usar un orden de índice determinado, puede mejorar el rendimiento si ordena periódicamente la tabla en este orden.
- Use archivos .cdx en lugar de .idx en entornos multiusuario, ya es más rápido actualizar un solo archivo .cdx que varios archivos .idx.
Vea también
Optimizar las aplicaciones | Optimizar el sistema | Usar Rushmore™ para agilizar el acceso a los datos | Optimizar formularios y controles | Optimizar programas