Когда записи помечены для удаления в Visual FoxPro, они не удаляются физически до тех пор, пока не будет вызвана команда PACK. Поэтому, эти записи остаются видимыми и к ним имеется доступ для производства базовых операций с таблицами до тех пор, пока действует установка, определенная командой SET DELETED OFF. Если команду выпустить с опцией ON, то записи помеченные для удаления будут скрыты от базовых операций.
Для гарантии, что оптимизация Rushmore будеи использована в запросах, некоторые разработчики создают индексные тэги для записей, помеченных для удаления с помощью функции DELETED( ) в индексном выражении. Функция DELETED( ) определяет, помечена ли запись для удаления. Например, приведенная ниже строка кода создает индекс с именем Deleted используя индексное выражение, которое включает в себя функцию DELETED( ), которая отбирает записи помеченные для удаления:
![]() | |
---|---|
INDEX ON DELETED() TAG Deleted |
Однако, проблемы производительности по-прежнему существуют при использовании этого метода, обычно, при работе с большми наборами данных в сетевом LAN/WAN окружении, когда записи, помеченные для удаления разбросаны по таблице и когда по сети перемещается большой индекс.
Вместо этого, вы можете создать и использовать бинарный индекс, который оптимизирует бит, отвечающий за удаление записи, для увеличения производтельности, когда вы выдаете команду SET DELETED ON. Вы можете создать бинарный индекс с помощью выбора Binary index type в табличном дизайнере или с помощью ввода ключевого слова BINARY в команду INDEX. Напримре, приведенный ниже код создает ьинарный индекс с именем myDeleted, который отбирает записи, помеченные для удаления:
![]() | |
---|---|
INDEX ON DELETED() TAG DeletedTag BINARY |
Для получения подробной информации смотрите Типы индексов в Visual FoxPro, Функция DELETED( ) и Команда SET DELETED.
Оптимизация Rushmore для индексов, основанных на записях, помеченных для удаления
Для индексов, основанные на записях, помеченных для удаления, Visual FoxPro включает в себя следующие расширения для оптимизации Rushmore в SQL движке:
-
INDEX ON NOT(DELETED())
оптимизирует условия запросовNOT(DELETED())
иDELETED()
. В версиях, до Visual FoxPro 9.0, оптимизируемым было толькоDELETED()
.Например, оптимизированными являются приведенные ниже запросы:
Скопировать код
CLEAR CLOSE DATABASE ALL SYS(3054,1) CREATE TABLE myTable (f1 I) INDEX ON NOT(DELETED()) TAG NotDel SET DELETED OFF SELECT * FROM myTable WHERE NOT(DELETED()) INTO CURSOR tempCursor SELECT * FROM myTable WHERE DELETED() INTO CURSOR tempCursor SET DELETED ON SELECT * FROM myTable INTO CURSOR tempCursor INDEX ON DELETED() TAG Del SET DELETED OFF SELECT * FROM myTable WHERE NOT(DELETED()) INTO CURSOR tempCursor SELECT * FROM myTable WHERE DELETED() INTO CURSOR tempCursor SET DELETED ON SELECT * FROM myTable INTO CURSOR tempCursor CLOSE DATABASE ALL
-
INDEX ON ... FOR DELETED( )
илиINDEX ON ... FOR NOT(DELETED())
оптимизируют условия запросовDELETED()
илиNOT(DELETED())
query соответственно когда не присутствуютINDEX ON DELETED()
илиINDEX ON NOT(DELETED())
.For example, the following queries are now optimized:
Скопировать код
CLEAR CLOSE DATABASES ALL SYS(3054,1) CREATE TABLE myTable (f1 I) INDEX ON f1 TAG f1_NotDel FOR NOT(DELETED()) INDEX ON f1 TAG f1_Del FOR DELETED() SET DELETED OFF SELECT * FROM myTable WHERE NOT(DELETED()) INTO CURSOR tempCursor SELECT * FROM myTable WHERE DELETED() INTO CURSOR tempCursor SET DELETED ON SELECT * FROM myTable INTO CURSOR tempCursor INDEX ON DELETED() TAG DeletedRec SET DELETED OFF SELECT * FROM myTable WHERE NOT(DELETED()) INTO CURSOR tempCursor SELECT * FROM myTable WHERE DELETED() INTO CURSOR tempCursor SET DELETED ON SELECT * FROM myTable INTO CURSOR tempCursor CLOSE DATABASES ALL
-
Когда Visual FoxPro может определить, что запрос не должен возвращать удаленные или неудаленные записи, и, если не присутствует нефильтрованный индекс, он использует
INDEX ON <expression> ... FOR DELETED()
илиINDEX ON <expression> FOR NOT(DELETED())
.Например, приведенные ниже запросы являются оптимизируемыми:
Скопировать код
CLEAR CLOSE DATABASE ALL SYS(3054,1) CREATE TABLE myTable (f1 I,f2 I) INDEX ON f1 TAG f1_NotDel FOR NOT(DELETED()) INDEX ON f1 TAG f1_Del FOR DELETED() SET DELETED OFF SELECT * FROM myTable WHERE ; (NOT(DELETED()) AND f1>3) OR ; && Тэг f1_NotDel используется для оптимизации. (DELETED() AND f1<3) ; && Тэг f1_Del используется для оптимизации. INTO CURSOR tempCursor SELECT * FROM myTable WHERE ; (f1>3 AND NOT(DELETED())) OR ; && Не оптимизируемое. f1>3 идет первым. (f1<3 AND DELETED()) ; && Не оптимизируемое. f1<3 идет первым. INTO CURSOR tempCursor SET DELETED ON SELECT * FROM myTable WHERE ; (f1>3000) OR ; && Тэг f1_NotDel используется для оптимизации. (f1<1000) ; && Тэг f1_NotDel используется для оптимизации. INTO CURSOR tempCursor INDEX ON f1 TAG f1 SET DELETED OFF SELECT * FROM myTable WHERE ; (NOT(DELETED()) AND f1>3) OR ; && Тэг f1 используется для оптимизации. (DELETED() AND f1<3) ; && Тэг f1 используется для оптимизации. INTO CURSOR tempCursor SET DELETED ON SELECT * FROM myTable WHERE ; (f1>3000) OR ; && Тэг f1 используется для оптимизации. (f1<1000) ; && Тэг f1 используется для оптимизации. INTO CURSOR tempCursor CLOSE DATABASE ALL
-
Если для оптимизации Rushmore используются только индексы с выражением фильтра
NOT(DELETED())
и SET DELETED установлен в ON, тогда then дополнительная оптимизация, использующаяNOT(DELETED())
не производится, так как в этом нет необходимости.
SQL ) and MAX( оптимизация для агрегатных функций MIN( ) и MAX( )
Когда это подходит, Visual FoxPro использует выражения фильтра FOR DELETED()
и FOR NOT(DELETED())
для оптимизации агрегатных функций MIN( ) и MAX( ). Visual FoxPro использует фильтрованные выражения, основанные на индексном выражении DELETED(),
когда это возможно.
Фильтрованные инедксы, которые используют FOR NOT(DELETED())
могут предоставить дополнительную оптимизацию с SQL запросами с любой установкой SET DELETED. Однако, фильтрованный индексный тэг с FOR DELETED()
предоставляет преимущества только тогда, когда SET DELETED установле в OFF.
![]() |
---|
Эти оптимизации не основаны на технологии Rushmore; поэтому они не появляются в результате, возвращаемом SYS(3054) - Rushmore Query Optimization Level. |
![]() | |
---|---|
CLEAR SET SAFETY OFF CLOSE DATABASE ALL CREATE TABLE myTable (f1 I) INDEX ON f1 TAG f1 SET DELETED OFF SELECT MAX(f1) FROM myTable INTO CURSOR temp1 * тэг f1 используется для оптимизации MAX(f1) SELECT MAX(f1) FROM myTable WHERE DELETED()INTO CURSOR temp1 * MAX(f1) не оптимизируемое, а поэтому медленное SET DELETED ON SELECT MAX(f1) FROM myTable INTO CURSOR temp1 * MAX(f1) не оптимизируемое, а поэтому медленное SELECT myTable INDEX ON f1 TAG f1Del FOR DELETED() INDEX ON f1 TAG f1NotDel FOR NOT(DELETED()) SET DELETED OFF SELECT MAX(f1) FROM myTable INTO CURSOR temp1 * тэг f1 используется для оптимизации MAX(f1) SELECT MAX(f1) FROM myTable WHERE DELETED()INTO CURSOR temp1 * тэг f1Del используется MAX(f1) SET DELETED ON SELECT MAX(f1) FROM myTable INTO CURSOR temp1 * тэг f1NotDel используется для оптимизации MAX(f1) CLOSE DATABASE ALL |