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