Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VisualFoxPro.doc
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
11 Мб
Скачать
☆

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

Рашмор-оптимизируемые выражения опции 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

Рис. 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" даст тот же результат, но будет исполнен медленнее.

8.2.7. Составление оптимизируемых выражений

Выражения составляются посредством операций AND, OR и NOT и в зависимости от характеристики операндов будут либо полностью рашмор-оптимизируемы, либо частично, либо неоптимизируемы.

Возможные варианты приведены в табл. 8.3.

Таблица 8.3

Варианты рашмор-выражений

Выражение

Операция

Выражение

Результат

Полностью оптимизируемое

AND

Полностью оптимизируемое

Полностью оптимизируемое

"

OR

"

"

"

AND

Частично оптимизируемое

Частично оптимизируемое

"

OR

"

"

"

AND

Неоптимизируемое

"

"

OR

"

Неоптимизируемое

–

NOT

Полностью оптимизируемое

Полностью оптимизируемое

Частично оптимизируемое

AND

Частично оптимизируемое

Частично оптимизируемое

"

OR

"

"

"

AND

Неоптимизируемое

"

"

OR

"

Неоптимизируемое

–

NOT

Частично оптимизируемое

"

Неоптимизируемое

AND

Неоптимизируемое

"

"

OR

"

"

–

NOT

"

"

Примеры простых выражений:

&& Полностью оптимизируемое выражение c AND

locate for FirstName = "FRED" and HireDate < {^1997–12–30}

&&

&& Неоптимизируемое выражение c OR

locate for FirstName = "FRED" or "S" $ LastName

&&

&& Полностью оптимизируемое выражение c NOT

browse for not FirstName = "FRED"

Примеры более сложных выражений:

&& Полностью оптимизируемое выражение как комбинация

&& двух полностью оптимизируемых выражений

browse for (FirstName = "FRED" and HireDate < {^1997–12–30}) ;

or (LastName = "" and HireDate > {^1996–12–30})

&&

&& Частично оптимизируемое выражение как комбинация

&& полностью оптимизируемого и неоптимизируемого выражений

browse for (FirstName = "FRED" and HireDate < {^1997–12–30}) ;

and "S" $ LastName

&&

&& Частично оптимизируемое выражение как комбинация

&& двух частично оптимизируемых выражений

browse for (FirstName = "FRED" and "S" $ LastName) ;

or (FirstName = "DAVE" and "T" $ LastName)

&&

&& Неоптимизируемое выражение как комбинация

&& двух неоптимизируемых выражений

browse for (FirstName = "FRED" or "S" $ LastName) ;

or (FirstName = "DAVE" or "T" $ LastName)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]