Когда записи помечены для удаления в Visual FoxPro, они не удаляются физически до тех пор, пока не будет вызвана команда PACK. Поэтому, эти записи остаются видимыми и к ним имеется доступ для производства базовых операций с таблицами до тех пор, пока действует установка, определенная командой SET DELETED OFF. Если команду выпустить с опцией ON, то записи помеченные для удаления будут скрыты от базовых операций.

Для гарантии, что оптимизация Rushmore будеи использована в запросах, некоторые разработчики создают индексные тэги для записей, помеченных для удаления с помощью функции DELETED( ) в индексном выражении. Функция DELETED( ) определяет, помечена ли запись для удаления.  Например, приведенная ниже строка кода создает индекс с именем Deleted  используя индексное выражение, которое включает в себя функцию DELETED( ), которая отбирает записи помеченные для удаления:

  CopyCode imageСкопировать код
INDEX ON DELETED() TAG Deleted

Однако, проблемы производительности по-прежнему существуют при использовании этого метода, обычно, при работе с большми наборами данных в сетевом LAN/WAN окружении, когда записи, помеченные для удаления разбросаны по таблице и когда по сети перемещается большой индекс.

Вместо этого, вы можете создать и использовать бинарный индекс, который оптимизирует бит, отвечающий за удаление записи, для увеличения производтельности, когда вы выдаете команду SET DELETED ON. Вы можете создать бинарный индекс с помощью выбора Binary index type в табличном дизайнере или с помощью ввода ключевого слова BINARY в команду INDEX. Напримре, приведенный ниже код создает ьинарный индекс с именем myDeleted, который отбирает записи, помеченные для удаления:

  CopyCode imageСкопировать код
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().

    Например, оптимизированными являются приведенные ниже запросы:

      CopyCode imageСкопировать код
    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:

      CopyCode imageСкопировать код
    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()).

    Например, приведенные ниже запросы являются оптимизируемыми:

      CopyCode imageСкопировать код
    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.

NoteЗамечание

Эти оптимизации не основаны на технологии Rushmore; поэтому они не появляются в результате, возвращаемом SYS(3054) - Rushmore Query Optimization Level.

  CopyCode imageСкопировать код
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

Смотрите также