Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 USE и SELECT в сети  [new]
Kozerog
Member

Откуда: М О
Сообщений: 126
Несколько вопросов для понимания.

Ситуация: Таблица NameTabe.dbf лежит на C: компьютера A.

Компьютер В соеденен с компьютером A локальной сетью
(для него X - C: компьютера A).

Что происходит(какие манипуляции совершает FOX с исходной таблицей NameTabe.dbf )
когда в VFP на компьютере В выполняютя следующие команды:

1. USE X:\NameTabe.dbf SHARED

2. SELECT * FROM X:\NameTabe.dbf WHERE NameField=1 INTO TABLE C:\NameTabe.dbf

3. SELECT * FROM X:\NameTabe.dbf WHERE .T. INTO TABLE C:\NameTabe.dbf

4. USE X:\NameTabe.dbf SHARED - в FOX на компьютере A когда п1.
17 сен 03, 21:13    [343421]     Ответить | Цитировать Сообщить модератору
 Re: USE и SELECT в сети  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
1. USE X:\NameTabe.dbf SHARED

В FoxPro создается идентификатор (хендл, дескриптор) указанной таблицы. В FoxPro - этот идентификатор называется "рабочая область". Собственно закачка данных произойдет, только когда они потребуются.

2. SELECT * FROM X:\NameTabe.dbf WHERE NameField=1 INTO TABLE C:\NameTabe.dbf

Если в данном случае есть Rushmore-оптимизация (как минимум, должен быть индекс по полю NameField), то на клиентскую машину закачивается соответсвующий индексный тэг. В нем отбираются указатели записи на записи со значением NameField=1. Затем с сервера вытягиваются только записи с найденными значениями указателя и формируется таблица C:\NameTable.dbf

Если оптимизации нет, то сначала качается ВСЯ таблица X:\NameTable и уже у клиента выполняется выборка и формирование итога.

Факт оптимизации можно проверить по функции SYS(3054,1). Должно быть как минимум "Partial".

3. SELECT * FROM X:\NameTabe.dbf WHERE .T. INTO TABLE C:\NameTabe.dbf

На клиентскую машину закачивается ВСЯ таблица X:\NameTable и уже у клиента выполняется выборка и формирование итога.

4. USE X:\NameTabe.dbf SHARED - в FOX на компьютере A когда п1.

Не понял? Что произойдет если открыть одну и ту же таблицу с разных компьютеров? Ничего страшного. Будут созданы идентификаторы этой таблицы на обоих компьютерах.
18 сен 03, 15:20    [344491]     Ответить | Цитировать Сообщить модератору
 Re: USE и SELECT в сети  [new]
Kozerog
Member

Откуда: М О
Сообщений: 126
==> ВладимирМ

<2. SELECT * FROM X:\NameTabe.dbf WHERE NameField=1 INTO TABLE C:\NameTabe.dbf

Если в данном случае есть Rushmore-оптимизация (как минимум, должен быть индекс по полю NameField), то на клиентскую машину закачивается соответсвующий индексный тэг. В нем отбираются указатели записи на записи со значением NameField=1. Затем с сервера вытягиваются только записи с найденными значениями указателя и формируется таблица C:\NameTable.dbf >

А какой механизм этого "вытягивания"?

Если в процессе решения этой задачи на сервере добавили записей и соответственно перестроился индексный файл? Что новые записи в поиске не участвуют ?

Извините, третий вопрос правильно так:

3. SELECT * FROM X:\NameTabe.dbf WHERE .F. INTO TABLE C:\NameTabe.dbf
18 сен 03, 21:12    [345029]     Ответить | Цитировать Сообщить модератору
 Re: USE и SELECT в сети  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Внутренний механизм реализации Rushmore-оптимизации - это коммерческая тайна Microsoft. Можно делать только некоторые опосредованные выводы.

Например, вывод о копировании только тега, а не целиком индексного файла был сделан на основе анализа сетевого трафика в момент выполнения запроса.

Насчет учитывания новых записей - это вопрос решает сам FoxPro. Предположительно, если была запись в момент выполнения запроса, то новая запись учтена не будет.


3. SELECT * FROM X:\NameTabe.dbf WHERE .F. INTO TABLE C:\NameTabe.dbf

Еще раз посмотрел, что именно качается с сервера при таком запросе. Судя по объемам и адресам прочитанной информации получается следующее:

Читается заголовок индексного файла в поисках тега, выражение которого совпадает с выражением, указанном в WHERE.

Поскольку вся информация, необходимая для вычисления выражения в WHERE находится у клиента, то она сразу же и вычисляется и с сервера берется сразу результат.

По крайней мере я не увидел перетягивания исходной таблицы на клиента. Да это и так чувствуется по скорости выполнения запроса.
19 сен 03, 12:47    [345650]     Ответить | Цитировать Сообщить модератору
 Re: USE и SELECT в сети  [new]
Kozerog
Member

Откуда: М О
Сообщений: 126
Еще вопрос, вытекающий из ответов на 1 и 4:

Как в программе быстро узнать количество открытых рабочих областей и
их номера. Или только перебор по всем возможным 32767 значениям?
19 сен 03, 22:01    [346694]     Ответить | Цитировать Сообщить модератору
 Re: USE и SELECT в сети  [new]
Андрей Давыдов
Guest
AUSED(ArrayName [, nDataSessionNumber])
19 сен 03, 22:24    [346705]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить