Mejorar el rendimiento de las actualizaciones y eliminaciones

Puede acelerar las instrucciones Update y Delete:

  • Si agrega marcas de hora a sus tablas remotas.
  • Si usa la propiedad CompareMemo.
  • Si usa el modo de transacción manual.
  • Si usa procedimientos almacenados en el servidor.
  • Si crea lotes de actualizaciones.

Agregar marcas de hora

Puede mejorar el rendimiento cuando actualice, inserte o elimine datos en una tabla remota que contenga muchos campos si agrega un campo de marca de hora a la tabla remota, siempre y cuando su servidor ofrezca el tipo de campo Timestamp.

La presencia de un campo de tipo Timestamp en una tabla remota le permite usar la opción DB_KEYANDTIMESTAMP de actualización WhereType de SQL de Visual FoxPro. Esta opción ahorra tiempo de proceso porque Visual FoxPro sólo compara dos campos de la vista, el campo de clave y el campo de marca de hora, contra una tabla remota para detectar conflictos de actualización. Al comparar únicamente dos campos, en lugar de todos los campos actualizables (mediante la opción DB_KEYANDUPDATABLE) o todos los campos modificados (mediante la opción DB_KEYANDMODIFIED), la opción DB_KEYANDTIMESTAMP reduce el tiempo necesario para actualizar datos remotos. Para obtener más información acerca de las opciones WhereType, vea Crear vistas.

Nota   La opción DB_KEYANDTIMESTAMP compara los campos de clave y de marca de hora únicamente cuando la tabla remota contiene un campo de marca de hora. Si usa la opción DB_KEYANDTIMESTAMP frente a una tabla remota que no contiene un campo de marca de hora, Visual FoxPro sólo compara los campos de clave.

El Asistente para upsizing puede agregar automáticamente a las tablas que exporte campos de marca de hora, según proceda. Para obtener más información, vea "Columnas de marca de hora" en Upsizing de las bases de datos de Visual FoxPro.

Sugerencia   Si hace algo que modifique la estructura de una tabla base de una vista, como agregar un campo de marca de hora, quizá tenga que volver a crear la vista. Los campos de una definición de vista se almacenan en la base de datos, y todos los cambios realizados a las tablas base para una vista después de usarla no quedarán reflejados en la definición de la vista hasta que no vuelva a crearla.

Excluir campos memo de la cláusula WHERE de actualización

Cuando sea apropiado, puede acelerar las actualizaciones evitando que los campos memo (campos de tipo Memo, General o Picture) de vista se comparen con sus homólogos de tabla de base. De forma predeterminada, la propiedad CompareMemo se establece como verdadero (.T.), lo cual incluye automáticamente los campos memo en la cláusula WHERE de SQL generada al crear una vista actualizable. Puede establecer la propiedad CompareMemo como falso (.F.) para excluir memos de la cláusula WHERE de SQL.

Usar transacciones

Para conseguir un rendimiento óptimo, use el modo de transacción manual y administre usted mismo las transacciones. El modo de transacción manual le permite controlar cuándo confirma un grupo de transacciones, lo que permite al servidor procesar más instrucciones rápidamente.

El modo de transacción automática lleva más tiempo, ya que de forma predeterminada cada instrucción de actualización se ajusta en una transacción distinta. Este método ofrece el máximo control sobre cada instrucción individual de actualización, pero también aumenta la sobrecarga.

Puede mejorar el rendimiento en el modo de transacción automática si incrementa el valor de la propiedad BatchUpdateCount de la vista o del cursor. Cuando usa un valor grande para BatchUpdateCount, muchas instrucciones de actualización se incluyen por lotes en una única instrucción de actualización, que a su vez se ajusta en una única transacción. Sin embargo, si falla alguna instrucción del lote, se deshará todo el lote.

Sugerencia   Algunos servidores no admiten la propiedad BatchUpdateCount; debe probar esta propiedad en cada servidor remoto antes de implementarla en su aplicación.

Usar procedimientos almacenados en el servidor

Puede crear procedimientos almacenados en el servidor, que están precompilados y, por tanto, se ejecutan muy rápidamente. Puede ejecutar procedimientos almacenados, enviar parámetros mediante paso a través de SQL y mover procesos adicionales al servidor según sea apropiado para su aplicación.

Por ejemplo, quizá desee recopilar localmente la entrada del usuario y ejecutar una consulta de paso a través de SQL para enviar los datos al servidor, llamando al procedimiento almacenado apropiado. Para ello, cree un formulario en un cursor o una matriz local para recopilar los datos y escriba código que cree una instrucción SQLEXEC( ) mediante el nombre del procedimiento almacenado en el servidor y los parámetros que se deben proporcionar. Podría agregar este código al evento Click de un botón de comando cuyo título fuera "Aceptar" o "Confirmar". Cuando el usuario elija el botón se ejecutará la instrucción SQLEXEC( ). Usar procedimientos almacenados en el servidor para actualizar datos remotos puede ser más eficiente, ya que los procedimientos almacenados se compilan en el servidor.

Crear lotes de actualizaciones

Si su aplicación actualiza una serie de registros, cree lotes de actualizaciones de modo que la red y el servidor las gestionen más eficazmente. Las instrucciones Update o Insert se agrupan por lotes antes de enviarse al servidor, de acuerdo con el valor de la propiedad BatchUpdateCount de la vista. El valor predeterminado es 1, que significa que cada registro se envía al servidor con una instrucción de actualización. Puede reducir el tráfico de la red si incrementa el valor para empaquetar múltiples actualizaciones en una instrucción.

Sugerencia   Algunos servidores no admiten la propiedad BatchUpdateCount; debe probar esta propiedad en cada servidor remoto antes de implementarla en su aplicación.

Para usar esta característica eficazmente, la conexión de la vista debe establecerse para el modo 5 de almacenamiento en búfer, para el almacenamiento optimista de tablas en búfer y los cambios deben confinarse desde el punto de vista ideal a los mismos campos en cada fila del cursor. Puede usar DBSETPROP( ) para establecer la propiedad BatchUpdateCount para la definición de la vista; para cambiar el valor para el cursor de vista activo, use CURSORSETPROP( ).

Optimizar el rendimiento de actualizaciones y eliminaciones

Puede usar las siguientes instrucciones para establecer propiedades de vista y conexión para optimizar el rendimiento de actualizaciones y eliminaciones. La propiedad BatchSize de la vista es la que tiene más influencia en el rendimiento.

Objeto Propiedad Valor Notas
Vista BatchUpdateCount 10 a 30 filas Establezca un valor superior para actualizaciones de pequeño tamaño.1 Se establece para aumentar el rendimiento hasta un 50%. El valor predeterminado es 1.
Conexión Asynchronous (.F.) Use conexiones síncronas para aumentar el rendimiento hasta un 50%, a no ser que desee poder cancelar instrucciones SQL mientras se ejecutan en el servidor. De forma predeterminada la conexión es síncrona.
Conexión WaitTime N/D Para aumentar el rendimiento en modo asíncrono, use un tiempo de espera más corto; para reducir el tráfico de red, aumente el tiempo de espera.
Conexión PacketSize 4K a 12K Tiene poca influencia en el rendimiento.

1 El mejor valor también depende de la velocidad del servidor.

El rendimiento real depende en gran manera de la configuración del sistema y de los requisitos de la aplicación. Pruebe con los valores de la tabla para determinar los mejores valores para su configuración. Las recomendaciones anteriores son óptimas para un equipo cliente donde se ejecute Windows NT versión 3.5 con ODBC 2.10 y el controlador de SQL Server 2.05; y un equipo servidor donde se ejecute Windows NT, Versión 3.5 con Microsoft SQL Server 4.21 y 6.0.

Vea también

Acelerar los formularios | Acelerar consultas y vistas | Optimizar el rendimiento cliente-servidor | Optimizar el uso de la conexión | Acelerar la recuperación de datos | Implementar una aplicación cliente-servidor