Распечатать страницу

Оптимизация выражений в Microsoft VFP

« Назад

Рашмор-оптимизируемые выражения опции FOR имеют следующий вид:

eIndex relOp eExp

или

eExpr relOp eIndex

где

eIndex – точно соответствует индексному выражению некоторого открытого индекса таблицы;

eExpr – произвольное выражение, которое может в частности включать поля других таблиц;

relOp – операция отношения (<, >, =, <=, >=, <>, #, == или !=) или функция ISNULL( ), BETWEEN( ), INLIST( ) или их SQL-эквивалент, например IS NULL.

Функции BETWEEN( ) и INLIST( ) употребляются в следующем виде:

BETWEEN(eIndex, eExpr1, eExpr2)

INLIST(eIndex, eExpr1 [, eExpr2, eExpr3, ...])

Замечание. Функции ISBLANK( ) и EMPTY( ) рашмор-неоптимизируемы.

Пример. Пусть имеются индексы с индексными выражениями FirstName, CustNo, HireDate и Upper(LastName). Тогда следующие выражения рашмор-оптимизируемы:

locate for FirstName = "Fred"

scan for CustNo >= 1000

endscan

recall for HireDate < {^1997-12-30}

delete for Upper(LastName) = "SMITH"

Оптимизируемые выражения могут содержать переменные и функции.

Пример. Используется индекс Upper(LastName).

store "SMITH" to cVar

delete for Upper(LastName) = cVar

locate for Upper(LastName) = Left(cVar, 3)

При выполнении запросов выражение текста запроса является оптимизируемым, если условие выбора точно соответствует индексному выражению. Так если создан следующий индекс Name

use Customer

index on Upper(Company) to d:\Company

то в тексте запроса

select * from Customers where Left(Company, 2) = "Co"

выражение Left(Company, 2) = "Co" является неоптимизируемым, поскольку не отвечает индексному выражению индекса Company.

В следующем тексте запроса

select * from Customers where Upper(Company) = "CO"

выражение Upper(Company) = "CO" рашмор-оптимизируемо.

Пример:

close databases

open database (Home(2) + 'Data\TestData')

use customer

index on Upper(Company) to d:\Company

Sys(3054, 12, "rushMore")

&& Результат запроса см. на рис. 8.2

select * from Customer where Upper(Company) = "CO"

? rushMore

136.1.-Результат-запроса

Рис. 8.2. Результат запроса

Результат, хранимый переменной rushMore:

select * from Customer where Upper(Company) = "CO"

Using index d:\Company.idx to rushMore optimize table Customer

Rushmore optimization level for table Customer: full

Запрос с выражением LEFT(Company, 2) = "Co" даст тот же результат, но будет исполнен медленнее.