Compartir a través de


Acelerar la recuperación de datos

Puede acelerar la recuperación de datos si administra el número de filas buscadas durante la búsqueda progresiva, controla el tamaño de búsqueda y usa la búsqueda diferida de Memo.

También puede usar la propiedad de vista UseMemoSize para devolver campos de caracteres como campos memo y después desactivar FetchMemo para permitir a su aplicación buscar de forma selectiva los campos de caracteres convertidos en campos memo.

Usar la búsqueda progresiva

Cuando se consulta un origen de datos remoto, Visual FoxPro recupera filas completas de datos y genera un cursor de Visual FoxPro. Para acelerar la recuperación de datos remotos, Visual FoxPro emplea la búsqueda progresiva de los cursores de vista y de los creados asíncronamente mediante paso a través de SQL. En lugar de pedirle a usted o a su aplicación que espere mientras se recupera un conjunto entero de datos, Visual FoxPro ejecuta una consulta y busca únicamente un pequeño subconjunto de las filas del conjunto de resultados en el cursor local. El tamaño predeterminado de este subconjunto es de 100 filas.

Nota   Las instrucciones síncronas de paso a través de SQL no emplean la búsqueda progresiva. Se recupera todo el conjunto de resultados solicitado por una instrucción SQLEXEC( ) antes de que el control vuelva a su aplicación.

A medida que Visual FoxPro recupera filas adicionales de datos, el cursor local contiene cada vez más datos consultados. Puesto que las filas se recuperan en distintos momentos desde el origen de datos, la información de las filas no se actualiza automáticamente. Si su conexión funciona en modo asíncrono, Visual FoxPro le devolverá el control a usted o a su programa en cuanto busque el primer subconjunto de datos. Durante el tiempo de inactividad, Visual FoxPro realiza una búsqueda en segundo plano de las filas restantes de los datos consultados, de subconjunto en subconjunto, en el cursor local. Esta situación le permite usar los datos ya buscados del cursor sin tener que esperar al resto de los datos.

Nota   El aumento del número de filas buscadas mejora el rendimiento, pero disminuye la capacidad de respuesta de la interfaz del usuario. La disminución del número de filas buscadas produce el efecto contrario.

Buscar datos bajo petición

Puede desactivar la búsqueda progresiva y buscar filas únicamente cuando sea necesario si usa la propiedad de cursor de vista o de base de datos FetchAsNeeded. Esto produce una obtención de datos más eficiente para vistas remotas o vistas que recuperen conjuntos de datos muy grandes.

La propiedad FetchAsNeeded se establece de forma predeterminada en falso (.F.), por lo que la búsqueda progresiva se utiliza de forma predeterminada. Cuando se establece la propiedad FetchAsNeeded como verdadero (.T.), sólo se busca en las filas cuando sea necesario. Cuando se establece la propiedad FetchAsNeeded en verdadero, no se puede realizar una actualización hasta que se complete la búsqueda, se llame a la función SQLCANCEL( ) en el controlador de conexión actual o se cierre la vista.

Si desea ver el impacto del uso de la propiedad FetchAsNeeded, establezca en verdadero (.T.) la propiedad FetchAsNeeded de una vista que recupera un conjunto de resultados grande y, a continuación, abra una ventana Examinar en la vista y desplácese hacia abajo. La barra de estado se actualiza para mostrar el número de filas recuperadas cuando se desplaza por la ventana Examinar.

Controlar la búsqueda del cursor

Si desea buscar todo el cursor, puede ejecutar el comando GOTO BOTTOM o cualquier comando que solicite acceso a todo el conjunto de datos.

Sugerencia   Si bien puede usar el comando GO BOTTOM para buscar todo el cursor, normalmente es más eficiente generar una vista parametrizada que busque únicamente una sola fila cada vez y vuelva a ejecutar la consulta a medida que el usuario cambie registros. Para obtener más información acerca de la generación de vistas de alto rendimiento, vea Crear vistas.

Los programas no ofrecen procesamiento de bucle inactivo. Para buscar cursores de vista mediante programación, use los comandos GO nRecordNumber o GOTO BOTTOM. Para buscar cursores creados mediante paso a través de SQL en modo asíncrono, llame a la función asíncrona de paso a través de SQL una vez por cada subconjunto de fila.

Cancelar una instrucción SQLEXEC( )

Puede usar la función SQLCANCEL( ) para cancelar una instrucción SQLEXEC( ) o una vista en cualquier momento. Sin embargo, si el servidor ha terminado de generar el conjunto de resultados remoto y Visual FoxPro ha empezado a buscar el conjunto de resultados remoto en un cursor local, la función SQLCANCEL( ) cancela la instrucción SQLEXEC( ) y deja el cursor local. Si desea eliminar el cursor local puede ejecutar el comando USE, que cierra el cursor y cancela la búsqueda.

El comando USE no cancelará una instrucción SQLEXEC( ) si dicha instrucción todavía no ha creado un cursor local. Para determinar si Visual FoxPro ha creado un cursor local, puede llamar a la función USED( ).

Controlar el tamaño de búsqueda

Puede controlar el número de filas buscadas de una vez por su aplicación en un servidor remoto si establece la propiedad FetchSize de su vista. Esta propiedad especifica el número de registros que se buscan en el cursor local desde el servidor remoto cada vez, mediante la búsqueda progresiva o llamadas asíncronas de paso a través de SQL. El valor predeterminado es 100 filas.

Para controlar el número de registros buscados de una vez en una vista

  • En el Diseñador de vistas, elija Opciones avanzadas en el menú Consulta. En el área Búsqueda de datos del cuadro de diálogo Opciones avanzadas, use el control numérico para establecer un valor para el Número de registros para buscar a la vez,

    –O bien–

  • Establezca la propiedad FetchSize mediante la función DBSETPROP( ) para establecer el tamaño de búsqueda en la definición de vista;

    –O bien–

  • Establezca la propiedad FetchSize mediante la función CURSORSETPROP( ) para establecer el tamaño de búsqueda del cursor de vista activo.

    Por ejemplo, el código siguiente establece la definición de la vista para buscar progresivamente 50 filas de una vez en Customer_remote_view:

    ? DBSETPROP('Customer_remote_view', 'View', 'FetchSize', 50)
    

Usar la búsqueda diferida de Memo

Una aplicación bien diseñada suele utilizar la búsqueda diferida de Memo para acelerar la descarga de conjuntos de resultados que contengan campos de tipo Memo o General. La búsqueda diferida de Memo significa que el contenido de los campos de tipo Memo y General no se descargará automáticamente cuando se descargue un conjunto de resultados. En su lugar, se descargan rápidamente el resto de los campos de la fila, y no se busca el contenido de los campos de tipo Memo y General hasta que no se solicita abriendo el campo Memo o General. La búsqueda diferida de Memo constituye el método más rápido de descarga de filas y permite buscar el contenido de los campos de tipo Memo o General, que puede ser muy grande, únicamente si lo necesita el usuario.

Por ejemplo, su formulario podría incluir un campo de tipo General que muestre una imagen. Para acelerar el rendimiento, puede usar la búsqueda diferida de Memo para impedir la descarga de la imagen hasta que el usuario elija el botón "Vista previa" de su formulario. El código subyacente al botón "Vista previa" busca el campo General y lo muestra en el formulario.

Para controlar la búsqueda diferida de Memo, utilice la propiedad FetchMemo de su vista o su cursor. La propiedad FetchMemo especifica si se debe buscar el contenido de los campos de tipo Memo o General cuando se descarga la fila. El valor predeterminado es verdadero (.T.), que significa que los campos de tipo Memo y General se descargan automáticamente. Si sus datos contienen grandes cantidades de datos de campos tipo Memo o General, quizá observe un mejor rendimiento si establece como falso (.F.) la propiedad FetchMemo.

Nota   La vista debe ser actualizable para permitir la búsqueda diferida de Memo, ya que Visual FoxPro usa los valores de campos clave establecidos por las propiedades de actualización para encontrar la fila de origen en el servidor cuando recupere el campo de tipo Memo o General. Para obtener información acerca de cómo hacer que una vista sea actualizable, vea Crear vistas.

Use DBSETPROP( ) para establecer la propiedad FetchMemo de una vista y CURSORSETPROP( ) para establecer la propiedad FetchMemo de un cursor.

Optimizar el rendimiento de búsqueda de datos

Puede usar las siguientes recomendaciones para establecer propiedades de conexión y vista con el fin de optimizar la búsqueda de datos. La propiedad PacketSize de su conexión es la que tiene más influencia en el rendimiento. Además, puede optimizar el rendimiento de búsqueda mediante conexiones síncronas.

Objeto Propiedad Valor
Conexión PacketSize 4K a 12K1
Conexión Asynchronous2 .F.
Vista FetchSize3 máximo

1. Establezca un valor más alto para las filas que contengan más datos; debe experimentar para encontrar el mejor valor.
2. 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.
3. El efecto de FetchSize depende mucho del tamaño de los registros del conjunto de resultados de búsqueda. En modo síncrono, no afecta al rendimiento de forma significativa, por lo que puede establecerlo como sea necesario para paso a través de SQL asíncrono que procese una búsqueda progresiva de vista. Si se reduce el valor de FetchSize, proporciona una significativa mejor capacidad de respuesta al buscar de forma progresiva una vista, pero disminuye la velocidad de búsqueda. Si aumenta, mejora el rendimiento de búsqueda de vista.

El rendimiento real depende en gran manera de la configuración del sistema y de los requisitos de la aplicación. Estas recomendaciones se basan en un equipo cliente donde se ejecute Windows NT versión 3.5, con ODBC versión 2.10 y un controlador ODBC de SQL Server versión 2.05; y un equipo servidor donde se ejecute Windows NT versión 3.5 con SQL Server versión 4.21 y versión 6.0.

Vea también

Optimizar el uso de la conexión | Acelerar consultas y vistas | Optimizar el rendimiento cliente-servidor | Acelerar los formularios | Mejorar el rendimiento de las actualizaciones y eliminaciones | Implementar una aplicación cliente-servidor