Compartir a través de


Usar Rushmore para agilizar el acceso a los datos

Para ayudarle a optimizar el rendimiento de las aplicaciones, Visual FoxPro incluye la tecnología Rushmore para acceso a los datos. Con Rushmore puede ejecutar determinadas operaciones complejas con tablas de forma muchísimo más rápida que sin esta tecnología.

Descripción de la tecnología Rushmore

La tecnología Rushmore es una técnica de acceso a datos que usa los índices estándar de Visual FoxPro para optimizar el acceso a datos. Puede utilizar Rushmore con cualquier índice de Visual FoxPro, incluyendo los índices de FoxPro 1.x (.idx), los índices compactos (.idx) o los índices compuestos (.cdx).

Tanto los índices .cdx como los índices compactos .idx utilizan una técnica de compresión que genera índices con una sexta parte del tamaño de los índices de formato tradicional sin comprimir. Visual FoxPro puede procesar un índice comprimido más rápido porque requiere menos acceso a disco y porque una mayor parte del índice se puede almacenar en búfer en memoria. Aunque Rushmore, como otras técnicas de acceso a archivos, se beneficia del menor tamaño de los índices compactos, también funciona correctamente con los índices de formatos antiguos.

Cuando Visual FoxPro procesa tablas muy grandes en equipos con poca memoria RAM, es posible que Rushmore no disponga de suficiente memoria para funcionar. En este caso, aparecerá un mensaje de advertencia (“No hay suficiente memoria para la optimización”). Su programa funcionará correctamente sin perder ningún dato; sin embargo, la consulta no se beneficiará de la tecnología Rushmore.

En su forma más sencilla, Rushmore incrementa la velocidad de los comandos en operaciones con una sola tabla mediante cláusulas FOR que especifican los conjuntos de registros en función de los índices existentes. Además, Rushmore puede aumentar la velocidad de funcionamiento de algunos comandos, como LOCATE e INDEX. Para ver una lista completa de los comandos optimizables, vea la sección siguiente “Usar Rushmore con tablas”.

Los comandos SQL de Visual FoxPro utilizan la tecnología Rushmore como herramienta básica para la optimización de consultas de múltiples tablas, utilizando los índices existentes e incluso creando nuevos índices con fines específicos para aumentar la velocidad de dichas consultas.

Usar Rushmore con tablas

Utilice Rushmore para optimizar el acceso a datos según el número de tablas que intervengan. Cuando tenga acceso a una única tabla, podrá beneficiarse de Rushmore siempre que aparezca una cláusula FOR. Cuando tenga acceso a múltiples tablas, las consultas SELECT - SQL prevalecen sobre todas las optimizaciones Rushmore. En un comando SQL, Visual FoxPro decide lo que se necesita para optimizar una consulta y realiza las operaciones automáticamente. No es necesario que abra tablas o índices. Si SQL decide que necesita índices, crea índices temporales para su propio uso.

Para utilizar Rushmore

Elija una de las opciones siguientes:

  • Para tener acceso a datos que estén contenidos en una única tabla, utilice una cláusula FOR en un comando como AVERAGE, BROWSE o LOCATE o use comandos SQL para actualizar tablas. Para obtener una lista completa de comandos que utilizan la cláusula FOR, vea la tabla siguiente.

    –O bien–

  • Para tener acceso a datos contenidos en más de una tabla, utilice un comando SELECT - SQL, DELETE - SQL y UPDATE - SQL.

La tabla siguiente muestra una relación de los comandos que utilizan cláusulas FOR. Rushmore está diseñado para que su velocidad sea proporcional al número de registros obtenidos en la operación.

Comandos que se pueden optimizar con cláusulas FOR

AVERAGE BLANK
BROWSE CALCULATE
CHANGE COPY TO
COPY TO ARRAY COUNT
DELETE DISPLAY
EDIT EXPORT TO
INDEX JOIN WITH
LABEL LIST
LOCATE RECALL
REPLACE REPLACE FROM ARRAY
REPORT SCAN
SET DELETED SET FILTER
SORT TO SUM
TOTAL TO  

Si utiliza una cláusula de alcance, además de una expresión de cláusula FOR optimizable, el alcance debe ser ALL o REST para poder aprovechar la tecnología Rushmore. Las cláusulas de alcance NEXT o RECORD desactivan Rushmore. Puesto que el alcance predeterminado es ALL para la mayoría de los comandos, Rushmore funcionará cuando omita la cláusula de alcance.

Rushmore puede utilizar cualquiera de los índices abiertos salvo los índices filtrados y UNIQUE.

Nota   Para obtener un rendimiento óptimo, no establezca el orden de la tabla.

Si crea índices o etiquetas, el orden se establecerá automáticamente. Si desea obtener el máximo rendimiento de Rushmore cuando trabaje con un conjunto de datos extenso con un orden determinado, ejecute SET ORDER TO para desactivar el control de los índices y luego utilice el comando SORT.

Crear índices de forma eficaz para Rushmore

Rushmore no puede aplicarse a todos los índices. Si usa una cláusula FOR en el comando INDEX, Rushmore no puede utilizar el índice para la optimización. Por ejemplo, debido a que contiene una cláusula FOR, la instrucción siguiente no puede optimizarse:

INDEX ON ORDNUM FOR DISCOUNT > 10 TAG ORDDISC

De forma análoga, Rushmore no puede usar un índice creado con una condición NOT. Por ejemplo, la expresión siguiente puede optimizarse:

INDEX ON DELETED() TAG DEL

Sin embargo, ésta no puede optimizarse:

INDEX ON NOT DELETED() TAG NOTDEL
  • En el caso especial de que desee excluir los registros eliminados de una consulta, use un índice como el del primer ejemplo para agilizar las operaciones una vez establecido SET DELETED en ON.

Funcionamiento sin Rushmore

Las operaciones de obtención de datos se ejecutan sin la optimización Rushmore en las siguientes situaciones:

  • Cuando Rushmore no puede optimizar la expresión de la cláusula FOR en un comando posiblemente optimizable.
  • Cuando un comando que puede beneficiarse de Rushmore contiene una cláusula WHILE.
  • Cuando se disponga de poca memoria. La recuperación de datos sigue su curso, pero no se optimiza.

Deshabilitar Rushmore

Aunque no deseará hacerlo a menudo, es posible deshabilitar Rushmore. Cuando ejecute un comando que utilice Rushmore, Visual FoxPro determinará inmediatamente qué registros coinciden con la expresión de la cláusula FOR. A continuación, el comando manipula estos registros.

Si un comando que se puede optimizar modifica la clave de índice en la cláusula FOR, el conjunto de registros sobre el que opera Rushmore puede quedarse desfasado. En este caso, puede deshabilitar Rushmore para asegurarse de que dispone de la información más actualizada de la tabla.

Para deshabilitar Rushmore para un comando individual

  • Utilice la cláusula NOOPTIMIZE.

    Por ejemplo, este comando LOCATE no está optimizado:

    LOCATE FOR DueDate < {^1998-01-01} NOOPTIMIZE
    

Puede deshabilitar o habilitar Rushmore globalmente para todos los comandos que se benefician de Rushmore, con el comando SET OPTIMIZE.

Para deshabilitar Rushmore globalmente

  • Utilice el código siguiente:

    SET OPTIMIZE OFF
    

Para habilitar Rushmore globalmente

  • Utilice el código siguiente:

    SET OPTIMIZE ON
    

El valor predeterminado de la optimización Rushmore está definido como ON.

Optimizar expresiones Rushmore

La tecnología Rushmore depende de la presencia de una expresión básica optimizable en una cláusula ** FOR o en una cláusula SQL WHERE. Una expresión básica optimizable puede formar una expresión completa o puede aparecer como parte de una expresión. También puede combinar expresiones básicas para formar una expresión optimizable compleja.

Crear expresiones básicas optimizables

Una expresión básica optimizable toma una de las dos formas siguientes:

eIndex relOp eExp

–O bien–

eExpr relOp eIndex

Una expresión básica optimizable tiene las siguientes características:

  • eIndex coincide exactamente con la expresión sobre la cual está construido un índice.
  • eExpr es cualquier expresión y puede incluir variables y campos de otras tablas no relacionadas.
  • relOp es uno de los siguientes operadores relacionales: <, >, =, <=, >=, <>, #, ==, o !=. También puede utilizar las funciones ISNULL( ), BETWEEN( ) o INLIST( ) (o sus equivalentes SQL, como IS NULL, etc.).

Puede utilizar BETWEEN( ) o INLIST( ) de las dos formas siguientes:

eIndex BETWEEN(eIndex, eExpr, eExpr)

–O bien–

eExpr INLIST(eIndex, eExpr)

Nota   ISBLANK( ) y EMPTY( ) no son optimizables con la tecnología Rushmore.

Si crea los índices firstname, custno, UPPER(lastname) y hiredate, todas las siguientes expresiones serán optimizables:

firstname = "Fred"
custno >= 1000
UPPER(lastname) = "SMITH"
hiredate < {^1997-12-30}

Una expresión optimizable puede contener variables y funciones que se evalúan como un valor concreto. Por ejemplo, al usar el índice addr, si ejecuta el comando STORE "WASHINGTON AVENUE" TO cVar, las siguientes instrucciones también serán expresiones básicas optimizables:

ADDR = cVar
ADDR = SUBSTR(cVar,8,3)

Cuándo se optimizan las consultas

Es importante entender cuándo se optimizarán las consultas y cuándo no. Visual FoxPro optimiza las condiciones de búsqueda; para ello, busca una coincidencia exacta entre el lado izquierdo de una expresión de filtro y una expresión de clave de índice. Por tanto, Rushmore puede optimizar una expresión sólo si busca la expresión exacta usada en un índice.

Por ejemplo, imagine que acaba de crear una tabla y va a agregar el primer índice mediante un comando como el siguiente:

USE CUSTOMERS
INDEX ON UPPER(cu_name) TAG name

El comando siguiente no es optimizable porque la condición de búsqueda se basa únicamente en el campo cu_name y no en una expresión que esté indizada:

SELECT * FROM customers WHERE cu_name ="ACME"

En su lugar, debería crear una expresión optimizable con un comando como el siguiente, donde la expresión que está buscando coincida exactamente con la expresión indizada:

SELECT * FROM customers WHERE UPPER(cu_name) = "ACME"

Sugerencia   Para determinar el nivel de optimización Rushmore utilizado, llame a SYS(3054).

Combinar expresiones básicas optimizables

Puede combinar expresiones simples o complejas basadas en las cláusulas FOR o WHERE para incrementar la velocidad de recuperación de datos. Esto es posible si las expresiones FOR tienen las características de las expresiones básicas optimizables.

Las expresiones básicas pueden ser optimizables. Puede combinar expresiones básicas con los operadores lógicos AND, OR y NOT para formar una expresión de cláusula FOR compleja que también se puede optimizar. Una expresión creada con una combinación de expresiones básicas optimizables es totalmente optimizable. Si una o más de las expresiones básicas no son optimizables, la expresión compleja se podría optimizar parcialmente o bien no ser optimizable en absoluto.

Un conjunto de reglas determina si una expresión formada por expresiones básicas optimizables o no optimizables se puede optimizar totalmente, parcialmente o no se puede optimizar. La tabla siguiente resume las reglas de optimización de consultas de Rushmore.

Combinar expresiones básicas

Expresión básica Operador Expresión básica Resultados de la consulta
Optimizable AND Optimizable Totalmente optimizable
Optimizable OR Optimizable Totalmente optimizable
Optimizable AND No optimizable Parcialmente optimizable
Optimizable OR No optimizable No optimizable
No optimizable AND No optimizable No optimizable
No optimizable OR No optimizable No optimizable
NOT Optimizable Totalmente optimizable
NOT No optimizable No optimizable

Puede utilizar el operador AND para combinar dos expresiones optimizables en una expresión totalmente optimizable:

FIRSTNAME = "FRED" AND HIREDATE < {^1997-12-30}      && Optimizable

En el siguiente ejemplo, el operador OR combina una expresión básica optimizable con una expresión no optimizable para crear una expresión que no es optimizable:

FIRSTNAME = "FRED" OR "S" $ LASTNAME      && Not optimizable

Puede crear una expresión totalmente optimizable si utiliza el operador NOT con una expresión optimizable:

NOT FIRSTNAME = "FRED"      && Fully optimizable

También puede utilizar paréntesis para agrupar combinaciones de expresiones básicas.

Combinar expresiones complejas

Del mismo modo que puede combinar expresiones básicas, puede combinar expresiones complejas para crear una expresión aún más compleja totalmente optimizable, parcialmente optimizable o no optimizable. A su vez, puede combinar estas expresiones más complejas para crear expresiones que se pueden optimizar total o parcialmente o que no se pueden optimizar. La tabla siguiente describe los resultados de combinar estas expresiones complejas. Estas reglas también se aplican a expresiones agrupadas con paréntesis.

Combinar expresiones complejas

Expresión Operador Expresión Resultado
Totalmente optimizable AND Totalmente optimizable Totalmente optimizable
Totalmente optimizable OR Totalmente optimizable Totalmente optimizable
Totalmente optimizable AND Parcialmente optimizable Parcialmente optimizable
Totalmente optimizable OR Parcialmente optimizable Parcialmente optimizable
Totalmente optimizable AND No optimizable Parcialmente optimizable
Totalmente optimizable OR No optimizable No optimizable
NOT Totalmente optimizable Totalmente optimizable
Parcialmente optimizable AND Parcialmente optimizable Parcialmente optimizable
Parcialmente optimizable OR Parcialmente optimizable Parcialmente optimizable
Parcialmente optimizable AND No optimizable Parcialmente optimizable
Parcialmente optimizable OR No optimizable No optimizable
NOT Parcialmente optimizable No optimizable
No optimizable AND No optimizable No optimizable
No optimizable OR No optimizable No optimizable
NOT No optimizable No optimizable

Puede combinar expresiones totalmente optimizables con el operador OR para crear una expresión que también sea totalmente optimizable:

* Fully-optimizable expression
(FIRSTNAME = "FRED" AND HIREDATE < {^1997-12-30}) ;
   OR (LASTNAME = "" AND HIREDATE > {^1996-12-30})

Para crear expresiones parcialmente optimizables, combine una expresión totalmente optimizable con una expresión que no sea optimizable. En el siguiente ejemplo, el operador AND se utiliza para combinar estas expresiones:

* Partially-optimizable expression
(FIRSTNAME = "FRED" AND HIREDATE < {^1997-12-30}) ;
   AND "S" $ LASTNAME

Las expresiones parcialmente optimizables se pueden combinar para crear una expresión que también sea parcialmente optimizable:

* Partially-optimizable expression
(FIRSTNAME = "FRED" AND "S" $ LASTNAME) ;
   OR (FIRSTNAME = "DAVE" AND "T" $ LASTNAME)

La combinación de expresiones que no sean optimizables crea una expresión que tampoco se puede optimizar:

* Expression that is not optimizable
("FRED" $ FIRSTNAME OR "S" $ LASTNAME) ;   
   OR ("MAIN" $ STREET OR "AVE" $ STREET)

Vea también

Optimizar tablas e índices | Optimizar formularios y controles | Optimizar las aplicaciones | Optimizar el sistema | LOCATE | INDEX