Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Data Environment и загрузка формы / 25 сообщений из 25, страница 1 из 1
04.02.2009, 17:38
    #35797300
Sergey-D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Здравствуйте.
В Data Environment формы лежат курсоры на основе LocalView. Все параметризованные с NoDataOnLoad = .T. и обновляются через Requry("MyCursor"). Один курсор создается на основе довольно большой, для фокса, таблице - порядка 5 000 000 записей.
Собственно вопрос. Requry("MyCursor") с указанными параметрами отрабатывает приемлемо быстро(1-2 сек). А вот при начальной зогрузке форма открываетя секунд 5-7. Причина, в числе прочих, может быть в размере базовой таблицы, т. к. при исскуственном ее уменьшеннии, форма открываетя быстро. Такое ощущуение, что фокс строит план запроса, по подобию SQL Server.
Какие у кого есть советы?
Спасибо.
...
Рейтинг: 0 / 0
04.02.2009, 17:45
    #35797324
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
авторчто фокс строит план запроса, по подобию SQL Server

рассмешил

смотрим что говорит фокс про уровень оптимизации запроса,
читаем про бинарные индексы по делетед() при наличии 9-й версии
...
Рейтинг: 0 / 0
05.02.2009, 12:30
    #35798785
Sergey-D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Спасибо за советы, но.
1. Запрос оптимизирован, т.к. при его выполнени с установленными параметрами (LocalView параметризованный) в процессе работы никаких претензий к производительности нет.
2. Если я правильно понимаю, бинарный индекс для deleted() в VFP 9.0 был специально создан, чтобы облегчить работу по управлению удаленными записями (если не так - поправьте), а в базовой таблице нет записей, помеченных на удаление.
3. Опять же, не уверен, но думаю, что при установленном свойстве NoDataOnLoad = .T., при загрузке формы никакие курсоры не должны обновляться.
4. Так вот, что фокс делает когда загружает форму, если при пустой базовой таблице, форма грузится быстро, а при большой - медленно?
...
Рейтинг: 0 / 0
05.02.2009, 12:37
    #35798819
Data Environment и загрузка формы
Sergey-D4. Так вот, что фокс делает когда загружает форму, если при пустой базовой таблице, форма грузится быстро, а при большой - медленно?
Вот выяснением этого и надо заняться. Мы тут не видим вообще никаких таблиц и что-то подсказать не сможем.
...
Рейтинг: 0 / 0
05.02.2009, 12:47
    #35798848
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
автора в базовой таблице нет записей, помеченных на удаление

авторЗапрос оптимизирован, т.к. при его выполнени с установленными параметрами (LocalView параметризованный) в процессе работы никаких претензий к производительности нет.

я попросил узнать мнение среды фокспро

почему Вы сделали вывод о том, что запрос оптимизирован? я могу сделать вывод
о том, что при соблюдении всех условий при опред.настройке среды
и то он будет только частично оптим-н при отсутствии указанного индекса.
наличие или отсутствие уд-х записей ни коим образом не влияет на наобход-ть
создания указанного индекса - ответы на вопросы Вы можете найти
в справочном рук-ве - понимание рашмора ...
...
Рейтинг: 0 / 0
05.02.2009, 13:07
    #35798920
Sergey-D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Спасибо, буду разбираться.
Просто, для меня было очевидно, что оптимизирован запрос или нет, он не должен выполняться при открытии формы, если ему указали вообще не загружать никаких данных.
...
Рейтинг: 0 / 0
05.02.2009, 13:15
    #35798952
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Sergey-DСпасибо, буду разбираться.
Просто, для меня было очевидно, что оптимизирован запрос или нет, он не должен выполняться при открытии формы, если ему указали вообще не загружать никаких данных.

Совсем это не очевидно. При NoDataOnLoad = .T. фоксу все равно надо создать курсор, только пустой. А как можно узнать типы и размеры полей не выполняя запрос? Он все равно выполняется, только в каком-то другом режиме.
...
Рейтинг: 0 / 0
05.02.2009, 13:20
    #35798969
Sergey-D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Так и я думаю.
Механизм создания схемы не совсем понятен. Почему он зависит от размера базовой таблицы?
...
Рейтинг: 0 / 0
05.02.2009, 13:26
    #35798992
Sergey-D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Глупость спросил.
Sorry.
...
Рейтинг: 0 / 0
05.02.2009, 13:46
    #35799058
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Sergey-DТак и я думаю.
Механизм создания схемы не совсем понятен. Почему он зависит от размера базовой таблицы?
Ни разу не пробовал использовать NoDataOnLoad = .T. с DBF.
Чего там реально делает фокс - врядли кто-то знает кроме разработчиков. Тут только опытным путем искать наиболее быстрый вариант.

Можешь взять FILEMON и посмотреть чего и сколько фокс читает из файлов.

Возможно какой-другой код еще выполняется и тормоза от него.
...
Рейтинг: 0 / 0
05.02.2009, 13:53
    #35799088
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
авторВсе параметризованные с NoDataOnLoad = .T.

абсолютно бесполезные танцы.
если нужно загрузить парам-й запрос пустым то и так делаем

select * from where &pcWhere

pcWhere = '.f.'

с таким условие и поднимаем
курсор загрузится пустым

затем меняем
pcWhere = 'tt=1 and .....' и загузятся по условию
...
Рейтинг: 0 / 0
05.02.2009, 16:28
    #35799724
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
прошелмимо
select * from where &pcWhere

pcWhere = '.f.'

с таким условие и поднимаем
курсор загрузится пустым



Саня, не городи ерунды.

Фоксу при таком условии pcWhere = '.f.' придется просканировать всю таблу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SET DELETED OFF 
CREATE CURSOR test (f1 int )

INDEX on f1 TAG f1 

APPEND BLANK IN test 

SYS( 3054 , 11 )
i =  0 
SELECT *, f() FROM test WHERE .f. INTO ARRAY arr
?i
i =  0 
SELECT * FROM test WHERE f1 =  1  INTO ARRAY arr
?i

FUNCTION f()
i = i +  1 
...
Рейтинг: 0 / 0
05.02.2009, 16:37
    #35799771
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Фу ёлки палки пример обращений не оттуда выдрал да ещё с ошибкой , ну собственно говоря Rushmore всё показывает.
...
Рейтинг: 0 / 0
05.02.2009, 17:37
    #35799980
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
авторСаня, не городи ерунды.

вот пример, скана я не вижу,
где ошибка?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
_SCREEN.Cls()

create cursor pp (id i autoinc, fff c( 10 ))
for i= 1  to  1000 
	insert into pp (fff) values ('')
endfor
index on deleted() tag del binary

public PPP
PPP= 0 
set deleted off
SYS( 3054 , 12 )
lnTime = seconds()
select *, FFF() from pp where .f. into array tt
? seconds()-lnTime
? PPP
return

function FFF
PPP=PPP+ 1 
...
Рейтинг: 0 / 0
06.02.2009, 11:08
    #35801156
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Что-то не могу найти тему с Игорем Королевым, ну да ладно.

Вот код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
_SCREEN.Cls()

create cursor pp (id i autoinc, fff c( 10 ))
for i= 1  to  1000 
	insert into pp (fff) values ('')
endfor
index on deleted() tag del binary
INDEX on fff() TAG fff

public PPP
PPP= 0 
set deleted off
SYS( 3054 , 12 )
? SPACE( 10 )
select *, FFF() from pp where .f. into array tt nofilter
? SPACE( 10 )
select *, FFF() from pp where fff() =  0  into array tt nofilter
? SPACE( 10 )
select *, FFF() from pp where .f. AND fff() =  0  into array tt nofilter
return

function FFF
PPP=PPP+ 1 
RETURN ppp

Обрати внимание, что второй селект имеет оптимизируемое выражение, а третий селект уже частично оптимизированное выражение - такое поведение описано в хелпе Using Rushmore Query Optimization to Speed Data Access
Код: plaintext
Fully Optimizable  AND Not Optimizable  Partially Optimizable
...
Рейтинг: 0 / 0
06.02.2009, 16:58
    #35802405
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
2 PaulWist

я не понимаю что мне хочете доказать
и понимать пока не желаю

я продемонстировал пример
и указал на использовании where .f.
рез-т выполнения примера показал отсутствие сканирования таблицы,
при усттановке set dele on оптимизатор использует бинарн. индекс,
запрос выполняется мгновенно.

это доказывает возможность использования
для быстрой загрузки пустого курсора такого подхода
(указания в запросе where .f.)

зачем мне показаны 3 варианта ограничения с
вызовом ф-и я не понимаю и это не имеет никакого отношения
к конкретно указанной возможности (where .f.)
...
Рейтинг: 0 / 0
06.02.2009, 17:42
    #35802550
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
прошелмимо
зачем мне показаны 3 варианта ограничения с
вызовом ф-и я не понимаю и это не имеет никакого отношения
к конкретно указанной возможности (where .f.)

Что бы показать, что where .f. является неоптимизируемым выражением, те для определения соответствия данному условию надо просканировать всю таблу.
...
Рейтинг: 0 / 0
06.02.2009, 20:11
    #35802843
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
еще раз пример выполните и посмотрите

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
_SCREEN.Cls()

create cursor pp (id i autoinc, fff c( 10 ))
for i= 1  to  1000 
	insert into pp (fff) values ('')
endfor
index on deleted() tag del binary

public PPP
PPP= 0 
set deleted on
set talk on
SYS( 3054 , 12 )
*? SPACE( 10 )
select *, FFF() from pp where .f. into array tt nofilter
#if .f.  && .t.
ppp= 0 
? SPACE( 10 )
select *, FFF() from pp where fff() =  0  into array tt nofilter
? ppp
ppp = 0 
? SPACE( 10 )
select *, FFF() from pp where .f. AND fff() =  0  into array tt nofilter
#endif
? ppp
return

function FFF
PPP=PPP+ 1 
RETURN ppp

и не понимаю смысла последних 2-х запросов
...
Рейтинг: 0 / 0
06.02.2009, 20:46
    #35802885
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Комбинация неоптимизируемого where .f. и оптимизируемого fff()=0 дает частично оптимизируемое выражение.

Если бы where .f. AND fff() = 0 состояло бы из полностью оптимизируемых выражений, то фокс бы выдал full-оптимизацию, а этого не происходит, значит выраженеи where .f. является не оптимизируемым - отсюда следует, что фокс не может применить ни какой индекс и вынужден сканировать табличку.
...
Рейтинг: 0 / 0
06.02.2009, 20:54
    #35802895
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
пример запускали?

? ppp

скорость выполнения?
...
Рейтинг: 0 / 0
06.02.2009, 21:04
    #35802911
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Запускал.

ppp = 1 потому, что фокс делает нулевой прогон по структуре таблицы, что бы определить тип возвращаемых данных.

А оптимизации всё равно нет, да попытался фокс использовать индекс по deleted() и то потому, что мы ему сказали прячь удаленные данные, обнаружил, что удаленных данных нет и начал сканировать таблу - иначе бы он сказал, что Rushmore - full
...
Рейтинг: 0 / 0
06.02.2009, 21:10
    #35802920
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
скорость выполнения?

авторppp = 1 потому, что фокс делает нулевой прогон по структуре таблицы,

так или по всем записям бежит?
так почему ppp = 1 ?
...
Рейтинг: 0 / 0
06.02.2009, 21:16
    #35802925
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
прошелмимоскорость выполнения?

авторppp = 1 потому, что фокс делает нулевой прогон по структуре таблицы,

так или по всем записям бежит?
так почему ppp = 1 ?

А почему он должен быть не один, ведь в выборке нет записей удовлетворяющих условию where .f., соответственно ppp прирос из-за нулевого прогона.
...
Рейтинг: 0 / 0
06.02.2009, 21:21
    #35802929
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
Собственно из-за этого мы не можем получить счетчик сканирования, фокс открывает таблу в другом алиасе и чихает на нашу ф-ию, можно посмотреть о скане только по full, non, partitial
...
Рейтинг: 0 / 0
06.02.2009, 21:28
    #35802939
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Data Environment и загрузка формы
скорость выполнения?

еще раз обратите внимание на этот критерий
поэтому для решения задачи получения пустого курсора
в фокспро имеет право на жизнь
решение с where .f. в запросе
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Data Environment и загрузка формы / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]