Compartir a través de


Optimizar el acceso a datos remotos

La recuperación de datos de cualquier base de datos remota resulta cara. Con el fin de obtener datos de una base de datos del servidor, hay que seguir estos pasos:

  1. El cliente ejecuta la consulta en la base de datos remota.
  2. El servidor analiza y compila la consulta.
  3. El servidor genera un conjunto de resultados.
  4. El servidor indica al cliente que se ha completado el resultado.
  5. El cliente obtiene los datos del servidor a través de la red. Este paso puede realizarse en una sola operación o el cliente puede solicitar que los resultados se envíen en partes a medida que se vayan necesitando.

Puede usar varias técnicas para aumentar la velocidad de la recuperación o actualización de los datos. En la sección siguiente se tratan estas estrategias:

  • Recuperar sólo los datos necesarios
  • Actualizar tablas remotas de forma eficaz
  • Enviar instrucciones en un lote
  • Establecer el tamaño del paquete
  • Retrasar la recuperación de datos memo y binarios
  • Almacenar localmente datos de consulta
  • Crear reglas locales

Obtener sólo los datos necesarios

La mayor parte de las aplicaciones que usan datos remotos, formularios e informes no necesitan tener acceso a todos los datos de una tabla a la vez. Por tanto, puede aumentar el rendimiento si crea vistas remotas que busquen o actualicen únicamente los campos y registros que desee, reduciendo al mínimo la cantidad de datos que deben transmitirse a través de la red.

Para crear consultas que minimicen el trabajo de recuperación de datos de orígenes remotos, siga estas sugerencias:

  • Especifique sólo los campos que necesite. No use la instrucción SELECT * FROM customers a menos que necesite todos los campos de la tabla.

  • Incluya una cláusula WHERE para limitar el número de registros transferidos. Cuanto más específica sea la cláusula WHERE, menos registros se transmitirán al equipo y con más rapidez se terminará la consulta.

  • Si no puede predecir durante el diseño los valores que se van a utilizar en una cláusula WHERE, puede utilizar parámetros en la cláusula. Cuando se ejecute la consulta, Visual FoxPro usará el valor de una variable de parámetro o solicitará al usuario el valor de búsqueda. Por ejemplo, esta consulta permite a la aplicación o al usuario rellenar la región en el tiempo de ejecución:

    SELECT cust_id, company, contact, address ;
       FROM customers ;
       WHERE region = ?pcRegion
    
  • Establezca la propiedad NoDataOnLoad del objeto Cursor en el entorno de datos correspondiente. Esta técnica se suele utilizar con vistas parametrizadas en las que los datos del parámetro proceden del valor de un control de un formulario.

Actualizar tablas remotas de forma eficaz

Cuando se usa una vista para actualizar una tabla en un origen de datos remoto, Visual FoxPro debe comprobar si los registros que se están actualizando han sufrido alguna modificación. Para ello, Visual FoxPro debe examinar los datos en el servidor y compararlos con los datos existentes en su equipo. En algunos casos, esta operación puede resultar lenta.

Para optimizar el proceso de actualización de datos en orígenes de datos remotos, puede especificar la forma en que Visual FoxPro debe comprobar los registros modificados. Para ello, tiene que indicar la cláusula WHERE que Visual FoxPro debe generar para realizar la actualización.

Imagine, por ejemplo, que está usando una vista basada en una tabla de clientes en un origen de datos remoto. Ha creado la vista mediante una instrucción SELECT - SQL como la siguiente:

SELECT cust_id, company, address, contact ; 
   FROM customers ;
   WHERE region = ?vpRegion

Desea actualizar los cuatro campos que ha especificado en la vista, excepto el campo clave (cust_id). En la tabla siguiente se presenta la cláusula WHERE que Visual FoxPro generará para cada una de las opciones disponibles en la cláusula SQL WHERE.

Nota   La función OLDVAL( ) devuelve la versión preactualizada de los campos que se han modificado y la función CURVAL( ) devuelve el valor actual almacenado en el origen de datos remoto. Si compara estos valores, Visual FoxPro puede determinar si el registro ha cambiado en el origen de datos remoto desde que se transfirió al equipo.

Valor Cláusula WHERE resultante
Sólo campos clave
WHERE OLDVAL(cust_id) = CURVAL(cust_id)
Campos clave y actualizables
(predeterminado)
WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND
   OLDVAL(<mod_fld1>) = CURVAL(<mod_fld2>) AND
   OLDVAL(<mod_fld2>) = CURVAL(<mod_fld2>) AND
   ...
Campos clave y modificados
WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND   OLDVAL(company) = CURVAL(company) AND
   OLDVAL(contact) = CURVAL(contact) AND
   OLDVAL(address) = CURVAL(address)
Clave y marca de hora
WHERE OLDVAL(cust_id) = CURVAL(cust_id) AND
   OLDVAL(timestamp) = CURVAL(timestamp)

En general, debería elegir una opción para la cláusula SQL WHERE en este orden de preferencia:

  1. Clave y marca de hora, si la base de datos remota admite los campos de marca de hora, que es la forma más rápida de indicar si se ha modificado algún registro.
  2. Campos clave y modificados, porque los campos que se actualizan en el servidor son casi siempre un subconjunto del número total de campos que se podría actualizar.
  3. Campos clave y actualizables.
  4. Sólo campos clave. El uso de esta configuración implica que el servidor remoto insertará un registro totalmente nuevo que use la clave modificada y eliminará el registro anterior.

Enviar instrucciones en un lote

Algunos servidores (como Microsoft SQL Server) permiten enviar un lote de instrucciones SQL en un solo paquete. Esto aumenta el rendimiento porque se reduce el tráfico de la red y porque el servidor puede compilar múltiples instrucciones a la vez.

Por ejemplo, si especifica un tamaño de lote de cuatro y actualiza 10 registros en una base de datos, Visual FoxPro envía en un solo lote cuatro instrucciones como la siguiente a la base de datos del servidor:

UPDATE customer SET contact = "John Jones" ; 
   WHERE cust_id = 1;
UPDATE customer SET contact = "Sally Park" ; 
   WHERE cust_id = 2;
UPDATE customer SET company = "John Jones" ;
   WHERE cust_id = 3;
UPDATE customer SET contact = "John Jones" ;
   WHERE cust_id = 4

Para enviar instrucciones en un lote

  • En el cuadro de diálogo Opciones, elija la ficha Datos remotos y en Registros para actualizar por lotes especifique el número de registros que van a incluirse en el lote.

    –O bien–

  • Llame a las funciones DBSETPROP( ) o CURSORSETPROP( ) para establecer estas propiedades:

    • Establezca Transaction a 2.

    • Establezca BatchUpdateCount al número de instrucciones que se van a enviar en un lote.

      –O bien–

  1. En el Diseñador de vistas, elija Opciones avanzadas del menú Consulta para abrir el cuadro de diálogo Opciones avanzadas.

  2. En el área Rendimiento, situada junto a Número de registros para actualizar por lotes, especifique el número de instrucciones que se van a enviar en un lote.

    Nota   Debería probar con diferentes valores para esta propiedad y la propiedad PacketSize para optimizar las actualizaciones.

Establecer el tamaño del paquete

Puede optimizar el acceso a servidores remotos; para ello, ajuste el tamaño del paquete de red que se envía y se obtiene de la base de datos remota. Por ejemplo, si la red admite paquetes grandes (más de 4.096 bytes), puede aumentar el tamaño del paquete en Visual FoxPro con el fin de enviar más datos cada vez que lea o escriba en la red.

Para establecer el tamaño del paquete

  • Llame a las funciones DBSETPROP( ) o CURSORSETPROP( ) y establezca la propiedad PacketSize a un valor entero positivo. El valor predeterminado es 4.096.

    Nota   Es posible que distintos proveedores de red administren esta propiedad de forma distinta por lo que deberá consultar la documentación de su servicio de red. Novell® NetWare®, por ejemplo, tiene un tamaño de paquete máximo de 512 bytes, por lo que si se establece la propiedad PacketSize en un valor superior no obtendrá ninguna ventaja adicional.

Retardo de la recuperación de datos memo y binarios

Si está almacenando datos memo o binarios en un servidor remoto, puede aumentar el rendimiento; para ello, retarde la transferencia de estos datos hasta que la aplicación la requiera realmente.

Para retardar la recuperación de los datos memo y binarios

  • En el cuadro de diálogo Opciones, elija la ficha Datos remotos y en Opciones predeterminadas de vista remota, establezca Buscar memo.

    –O bien–

  • Llame a las funciones DBSETPROP( ) o CURSORSETPROP( ) para establecer la propiedad FetchMemo:

Almacenamiento local de datos de consulta

Muchas aplicaciones incluyen datos de consulta estáticos, como abreviaturas de estados, códigos postales y cargos de empleados. Si la aplicación contiene este tipo de datos y si la tabla no es demasiado grande, podría aumentar la velocidad de la aplicación; para ello, mantenga copias de esta información en el equipo de cada usuario, ya que las consultas no generan tráfico de red.

Esta técnica es especialmente útil para los datos que nunca cambian o lo hacen muy esporádicamente. Si los datos cambian en alguna ocasión, debe diseñar una estrategia para transferir una copia nueva de la tabla de consultas al equipo de cada usuario.

Crear reglas locales

Puede aumentar el rendimiento de la aplicación si crea reglas locales a nivel de campo y de registro en Visual FoxPro, en lugar de utilizar las reglas definidas en el servidor. Estas reglas pueden impedir que los datos que no son compatibles con las reglas de datos o de la empresa se introduzcan en la base de datos.

Con la definición de reglas en Visual FoxPro, los datos no válidos se interceptan antes de enviarse a través de la red, lo que es más rápido y permite controlar mejor las condiciones de error. Sin embargo, el uso de reglas locales también implica su coordinación con las reglas del servidor remoto. Por ejemplo, si se modifican las reglas del servidor, tendría que cambiar las reglas locales para que coincidieran.

Para obtener más información acerca de la creación de reglas locales, vea Actualizar datos en una vista en Crear vistas.

Vea también

Optimizar aplicaciones en entornos multiusuario | Optimizar aplicaciones internacionales | Optimizar las aplicaciones |Optimizar el sistema | NoDataOnLoad | SELECT - SQL