Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как быстрее UPDATE или LOCA ? / 23 сообщений из 23, страница 1 из 1
21.12.2007, 18:13
    #35027184
BMJ
BMJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
Вопрос собственно в заглавии. Как быстрее работает фокс?
При использовании:
1. UPDATE... WHERE usl=.t.
2. LOCA for usl=.t. и REPl ...,
при условии таблица одна, запись с условием уникальна?
...
Рейтинг: 0 / 0
21.12.2007, 18:21
    #35027203
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
Быстрее всего REPLACE FOR
...
Рейтинг: 0 / 0
21.12.2007, 19:19
    #35027289
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
Это зависит от нескольких параметров. Если бы что-то было однозначно лучше при людых условиях, то, наверное, только это бы и осталось, не так ли?
...
Рейтинг: 0 / 0
21.12.2007, 19:41
    #35027314
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
Sergey ChБыстрее всего REPLACE FOR

Нет. Это как раз самый неудачный (не скажу, что медленный) способ, поскольку в этом случае Fox пытается наложить табличную блокировку вне зависимости от реального количества изменяемых записей. А это не всегда возможно. Причем на эту команду распространяются ограничения накладываемые на команды с For-условием.

LOCATE FOR ... - надо уметь готовить. В смысле использовать. Новички обычно этого не умеют и получают страшные тормоза при включенном главном индексе. Это справедливо и для Replace for ...

Для новичков лучше использовать Update-SQL. Хотя тоже следует помнить, что эта команда игнорирует наложенные фильтры и могут быть проблемы с буферизированными данными.

Вопрос оптимизации (быстродействия) - это почти искусство. Очень много разных влияющих факторов. Сказать что всегда и при любых условиях следует использовать то и не использовать это, ну, как минимум, самонадеяно.
...
Рейтинг: 0 / 0
21.12.2007, 19:53
    #35027330
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
ВладимирМ
LOCATE FOR ... - надо уметь готовить. В смысле использовать. Новички обычно этого не умеют и получают страшные тормоза при включенном главном индексе. Это справедливо и для Replace for ...

Пожалуйста, если можно - поподробней. Нарывался и поэтому хотелось бы просечь...
...
Рейтинг: 0 / 0
21.12.2007, 19:59
    #35027337
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
ВладимирМ
Нет. Это Вопрос оптимизации (быстродействия) - это почти искусство. Очень много разных влияющих факторов. Сказать что всегда и при любых условиях следует использовать то и не использовать это, ну, как минимум, самонадеяно.

Огромная просьба выделить эту тему. Думаю, многим будет полезно. Разные ситуации, варианты решения или предложения, собственный опыт...
...
Рейтинг: 0 / 0
21.12.2007, 21:55
    #35027454
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
Все зависит от того - насколько большой курсор открыт у Вас. И есть ли индексы на условие.
Наверное, самый быстрай вариант - испльзовать sqlexec(). Но тогда локальные курсоры нужно будет обновить.
Очень много может быть различных сочетаний условий применения, влияющих на производительность.
...
Рейтинг: 0 / 0
21.12.2007, 22:03
    #35027464
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
В Вашев конкретном случае вариант 1 или 2 - будет быстрее работать LOCATE, т.к. Вы просмотрели курсор, (при наличии индексов Фокс может оптимизировать это) , сделали 1 replace и остановились. А условие WHERE - потянет за собой просмотр всего курсора (но опять же индексы могут оптимизировать поиск).
Индексы я имею в виду локальные, не серверные. В remote/local view нет индксов, я их в некоторых случаях принудительно индексирую локально - хотя не могу рекомендовать это всем - встречаются подводные камни.
...
Рейтинг: 0 / 0
22.12.2007, 00:03
    #35027572
BMJ
BMJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
Спасибо за разъяснение теории. Методом проб, с замером скорости ( по разности времени) не смог определиться.
...
Рейтинг: 0 / 0
22.12.2007, 08:48
    #35027692
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
BMJВопрос собственно в заглавии. Как быстрее работает фокс?
При использовании:
1. UPDATE... WHERE usl=.t.
2. LOCA for usl=.t. и REPl ...,
при условии таблица одна, запись с условием уникальна?
Если usl=.t. только для одной записи, то лучше сменить подход. .T. ведь где-то ранее предварительно устанавливается?
Если таблица имеет абстрактный ключ (nTableId) и индекс по нему (у меня со всеми таблицами так), то достаточно в переменную сохранить nTableId а дальше:
Код: plaintext
1.
2.
3.
4.
5.
6.
lnTableId = ... && Id интересующей записи
...
if !indexseek(lnTableId, .T., 'Table', 'nTableId')
    ? 'Отсутствует запись с nTableId = ', lnTableId
else
    repl in Table ....
endif
однозначно будет не медленнее. При работе с файловой БД в 99% случаев такого подхода достаточно для изменения-удаления одной записи, не надо гадать включится ли фоксовый оптимизатор, произойдет ли блокировка таблицы, в остальных случаях (групповая обработка множества записей) надо подходить индивидуально.
...
Рейтинг: 0 / 0
22.12.2007, 19:40
    #35028037
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
StandD ВладимирМ
LOCATE FOR ... - надо уметь готовить. В смысле использовать. Новички обычно этого не умеют и получают страшные тормоза при включенном главном индексе. Это справедливо и для Replace for ...
Пожалуйста, если можно - поподробней. Нарывался и поэтому хотелось бы просечь...
Все ниже следующее относится к таблицам DBF при прямом доступе к ним из FoxPro.

Основа оптимизации (ускорения) в FoxPro - это индексы. Есть индексы - оптимизация возможна. Нет индексов - ну, тоже возможна, но уже очень специфическими способами и в очень ограниченном круге задач.

Если по тому выражению, которое указано в условии поиска существует индекс, то, по умолчанию, включается механизм, так называемой, rushmore-оптимизации. Что означает это слово - никто не знает. Просто звучит красиво и загадочно

Однако если выполняется команда с FOR-условием (LOCATE FOR, REPLACE FOR и т.п.), то на оптимизируемый поиск накладывается еще и главный индекс. Т.е. искать-то FoxPro ищет, но главный индекс заставляет искать в определенном порядке, чем сводит на нет все преимущество оптимизации.

Поэтому, для лучше оптимизации команд с FOR-условием, если это возможно по условию задачи, желательно отключать главный индекс.

Код: plaintext
1.
2.
3.
select MyTab
SET ORDER TO    && отключение главного индекса
LOCATE FOR ...

Вот в этом случае rushmore-оптимизации ничто не мешает и поиск выполняется максимально быстро.

================
Однако если речь идет об удаленных данных (Remote View, Local View, CursorAdapter), то следует понимать, что результатом работы этих команд является таблица (курсор). Физически другая таблица. Выборка из исходных таблиц.

Поскольку это другая таблица, то, естесственно, она не имеет вообще никаких индексов. Поэтому говорить о rushmore-оптимизации для них - бессмысленно. Не может быть здесь никакой оптимизации. Вне зависимости от используемых команд. Разумеется, если Вы специально не создадите для них индексов. Но создание индексов занимает дополнительное время.

Однако по самой своей природе, выборка не должна быть очень уж большой. Это значит, что поиск в ней будет выполняться достаточно быстро и без оптимизации.
...
Рейтинг: 0 / 0
23.12.2007, 09:22
    #35028263
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
2ВладимирМ

Спасибо! Опытным путем уже сам дотумкал до того, чтобы перед Locate снимать индекс. Помогает.
А вот еще вопрос. Старый правда, но интересно - про фильтр на гриде. Уже обсуждалась тема, все понятно, но можно ли ускорить "проявление" данных на гриде под фильтром отключая индекс? Вот это у меня не получается. Скорее всего, сделать нельзя, но вдруг? Полсто есть один кусок, нормально работающий, но вот с такой штукой. А переделывать все неохота.
...
Рейтинг: 0 / 0
23.12.2007, 09:59
    #35028271
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
StandD... но можно ли ускорить "проявление" данных на гриде под фильтром отключая индекс? ... Фильтры работают гораздо быстрее если таблица открыта монопольно.
С таблицей БД это делать не стоит, но если фильтры используются активно, то можно использовать Local View примерно такое:
Код: plaintext
select * from MyTable order by ...
LV будет открыто монопольно и располагаться на клиенте. Основной минус - форма будет медленно открываться, т.к. при открытии вся таблица будет копироваться в LV

Чтобы код не переписывать, подменить таблицу на LV в DE формы можно так:
1. Убрать таблицу из DE
2. В DE.BeforeOpenTable()
Код: plaintext
1.
2.
open data MyDB
use MyTable alias MyTableReal in  0 
use MyTableLV alias MyTable in  0 
...
Рейтинг: 0 / 0
23.12.2007, 10:48
    #35028296
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
StandD
А вот еще вопрос. Старый правда, но интересно - про фильтр на гриде. Уже обсуждалась тема, все понятно, но можно ли ускорить "проявление" данных на гриде под фильтром отключая индекс? Вот это у меня не получается. Скорее всего, сделать нельзя, но вдруг? Полсто есть один кусок, нормально работающий, но вот с такой штукой. А переделывать все неохота.
Раз такой вопрос возник, значит про фильтр по прежнему не понятно.

Идея фильтра заключается в том, что это не есть нечто вычисленное один раз. Это условие, которые проверяется каждый раз при попытке перейти на очередную запись. Т.е. пытаешся перейти на запись и по новой вычисляешь фильтр. Поэтому факт наличия главного индекса существенно не влияет на скорость обработки фильтра.

Хотя, в VFP9 появилась специальная настройка

Код: plaintext
Grid.Optimize = .T.

которая как раз и призвана подключить механизм rushmore-оптимизации к фильтру в Grid.

Однако присоединясь к совету Dima_T . По возможности, лучше отказаться от фильтра в пользу выборки, Local View или CursorAdapter. Дело тут вовсе не в быстродействии (хотя это тоже играет свою роль), а в способности приложения меняться под конкретную задачу (масштабировании приложения). Фильтр накладывает более жесткие ограничения. Их труднее расширить или как-то изменить под новые условия.
...
Рейтинг: 0 / 0
23.12.2007, 12:02
    #35028328
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
2Dima T

Спасибо за инфу. Талица открыта немонопольно, но на локальном компьютере. Это имеет разницу с EXCL?
...
Рейтинг: 0 / 0
23.12.2007, 12:04
    #35028329
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
2 ВладимирМ

Понял, учту! Спасибо!
...
Рейтинг: 0 / 0
23.12.2007, 12:26
    #35028340
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
2 Dima T

Вместо того, чтобы задавать лишние вопросы - надо сначала самому попробовать! Виноват... Попробовал EXCL - здорово! Разница колоссальная. Спасибо за наводку!
...
Рейтинг: 0 / 0
23.12.2007, 12:28
    #35028345
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
ВладимирМ
Если по тому выражению, которое указано в условии поиска существует индекс, то, по умолчанию, включается механизм, так называемой, rushmore-оптимизации. Что означает это слово - никто не знает. Просто звучит красиво и загадочно


Документация от безвременно ушедшей фирмы Foxpro Inc. для FoxProLan 2.0 (for DOS) сказано, что в период разработки кода оптимизации запросов по ТВ шел сереал с супер-героем Рашмором. Его манера предевигаться стремительно и дала имя технологии.
...
Рейтинг: 0 / 0
23.12.2007, 13:35
    #35028388
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
StandD2 Dima T

Вместо того, чтобы задавать лишние вопросы - надо сначала самому попробовать! Виноват... Попробовал EXCL - здорово! Разница колоссальная. Спасибо за наводку!
EXCL для таблиц БД лучше не использовать. Основной прирост скорости из-за кэширования фоксом, но из-за этого могут проблемы возникнуть при вылетании проги или проблемах с сетью - изменения могут не успеть сохраниться на диск (в худшем случае порча структуры DBF), порча индексов.
Также таблица становится недоступна другим пользователям (даже в другой DataSession)
...
Рейтинг: 0 / 0
23.12.2007, 17:04
    #35028509
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
2 Dima T.

Таблица на лок.диске, только для одного пользователя и постоянно обновляется копированием, т.ч. "не страшно".
...
Рейтинг: 0 / 0
25.12.2007, 15:08
    #35032773
Allexxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
В ряде случаев быстрее работает

set order to
scan for ...
repla ...
endscan

а иногда
set order to needfield
seek needvalue
do while value = needvalue
repla ...
enddo

Разумеется, если repla не присваивает значения колонке условий
...
Рейтинг: 0 / 0
25.12.2007, 15:11
    #35032788
Allexxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
В ряде случаев быстрее работает

set order to
scan for ...
repla ...
endscan

а иногда
set order to needfield
seek needvalue
do while value = needvalue
repla ...
enddo

Разумеется, если repla не присваивает значения колонке условий
...
Рейтинг: 0 / 0
31.12.2007, 04:12
    #35042848
Jud
Jud
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как быстрее UPDATE или LOCA ?
apapacy ВладимирМ
...так называемой, rushmore-оптимизации. Что означает это слово - никто не знает. Просто звучит красиво и загадочно


Документация от безвременно ушедшей фирмы Foxpro Inc. для FoxProLan 2.0 (for DOS) сказано, что в период разработки кода оптимизации запросов по ТВ шел сереал с супер-героем Рашмором. Его манера предевигаться стремительно и дала имя технологии.
New English-Russian Dictionary, Dover Publications, New York (C) 1944 :-)
rush ... (run) скорый бег; натиск, напор, наплыв, порыв || ~ vn. кидаться, кинуться, бросаться, броситься, стремиться, хлынуть.
Ну, more и так ясно.
Герою ник-то неспроста подобрали...
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как быстрее UPDATE или LOCA ? / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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