powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SET FILTER TO
20 сообщений из 20, страница 1 из 1
SET FILTER TO
    #32363286
karpi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Из опыта кто может подсказать? Сеть 10/100 Mb в таблице около 400000 записей, пользователей около 30. Если поставить эту команду, чтобы каждый пользователь обрабатывал свои записи, скажется ли такая организация доступа к данным на скорость работы?
...
Рейтинг: 0 / 0
SET FILTER TO
    #32363305
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из опыта - если в фильтруемой таблице более 2000 записей, тормоза будут очень даже заметны.

Надо по возможности использовать set key to или выборку в курсор по условию фильтрования.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32363315
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то если есть по выражению фильтра есть индекс set filter работает довольно шустро.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32364492
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВообще-то если есть по выражению фильтра есть индекс set filter работает довольно шустро.
Вообще-то шустро... Если использовать потом эту таблицу для SCAN, или ещё какой позаписной обработки... Да и то SKIP - 1 перед первой и SKIP 1 после последней будут весьма медленными (особливо если сама выборка идёт в середине таблицы)
И хорошие такие тормоза, если эту же таблицу отображать в гриде :)
WBR, Igor
...
Рейтинг: 0 / 0
SET FILTER TO
    #32364651
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там кажется еще на вставках тормоза. Я фильтром пользуюсь только для фильтрации небольшого количества локальных данных. Курсора например.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32366559
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше делать выборку в курсор

Select pole1, pole2, ... , polen from table where условие into cursor имя курсора

Конечно упроститься если данные надо только просмотривать, если же их надо редактировать и/или добавлять и/или удалять, то придеться ещё кучу всего прописывать, но все можно сделать.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32377940
AlexVic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю как в вижуал, а в досовском такие вещи на фильтре делать нельзя. Создай индексы по ключевым полям и используй при выборке конструкции имеющие в команде слово for. Тогда вборка проходит моментально. В хелпе фокса об этом подробно описано, технология называлась вроде rushmore.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32377972
Нормально будет работать, если правильно установить фильтр
В таблицу надо добавить поле типа логическое (Flt L)
При установке фильтра, сначала пробежаться по всей таблице и установить значение этого поля по вычисляемому условию фильтра, а затем просто
SET FILTER TO (Flt)
и вполне шустро бегает
...
Рейтинг: 0 / 0
SET FILTER TO
    #32378232
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Дмитрий

1. Это решение не для многопользовательской среды.
2. Будет затрачено время на модификацию (и еще ого-го какое!) - а оно надо?
3. Тормозов в некоторых случаях (см. пост Igor) все равно не избежать.
4. Я, конечно, не против наличия метаданных, но это поле к таковым отнести нельзя. К данным - тем более. Стало быть, хранить его в таблице - неоправданная роскошь.
5. Как собираешься делать вещи типа requery (обеспечивать дальнейшую связь этого поля с полями, которые для него являются источниками данных)?

Извини за критику, конечно, но твое решение иначе как извратом не назовешь. :(
...
Рейтинг: 0 / 0
SET FILTER TO
    #32379126
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: karpi

А что Вы подразумеваете под "обработкой записей"? Если получение отчетов - то наличие индекса, как было сказано на скорости практически не скажется... Ну а если что-то смотреть, то все-равно больше 40 на экран не выведешь... лучше поступить, как подскзал AngelOKES. Хотя и простой фильтр работает быстро, но лучше все-таки SQL запрос или cursor adapter...

Удачи!
...
Рейтинг: 0 / 0
SET FILTER TO
    #32379846
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однозначно фильтр использовать нельзя!
Однозначно SET KEY проблемы не снимает.
Проблема возникает когда кто-то модифицирует записи - остальные получат сообщение Record Not Aviable и на какой-то миг все повиснет...
400000 записей *30 пользователей - это уже перебор для таких инструкций.

Решение - либо AngelOkes+Sergey Ch, либо другое, но медленное... :)
(Либо разрезать таблицу на две: архив и оперативную, но это уже другая история...)
...
Рейтинг: 0 / 0
SET FILTER TO
    #32383976
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все еще хуже.... Просмотрел свой старый код, где как раз около 800000 записей в таблицах было... Так вот я там не пользовался SELECTом,
а делал просто
DO WHILE .t.
if условие
scatter memvar into array ...
insert into временная from array...
endif
SKIP
enddo
И уже временную просматривал и т.п. - значит SELECT медленней работал... Ну в задачке правда и полей было 56!
...
Рейтинг: 0 / 0
SET FILTER TO
    #32384269
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>И уже временную просматривал и т.п. - значит SELECT медленней работал... Ну в задачке правда и полей было 56!

Вот это да - высокоуровневая конструкция работает быстрее сишного кода.
Уверен, либо бы не знали в то время о селекте, либо "не умели его готовить":)
...
Рейтинг: 0 / 0
SET FILTER TO
    #32384493
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я подумал, прежде чем писать, но факт остается фактом...

Там есть (на больших таблицах) какие-то подводные камни... SELECT даже полностью оптимизированный РАШМОРОМ работал не быстрее SEEK - DO WHILE, а держать кучу индексов было нельзя (изменения в таблице проходили очень медленно), так что при частично оптимизированном запросе или неоптимизированном вообще все как бы висло на черезчур долгое время...

Хотя это был Fox 2.6, сеть 10-тка, сервер P-150MMX... может что и изменилось, сейчас проверить не могу - просто предупредил... программеров больших таблиц.

Успехов.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32384517
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MaestroEv:

>Там есть (на больших таблицах) какие-то подводные камни...

Это не аргумент. Для начала их надо перечислить.

>SELECT даже полностью оптимизированный РАШМОРОМ работал не быстрее SEEK - DO WHILE,

Не верю, честно, не верю. Тест в качестве доказательства можете представить?

>Хотя это был Fox 2.6, сеть 10-тка, сервер P-150MMX... может что и изменилось, сейчас проверить не могу - просто предупредил... программеров больших таблиц.

О чем предупредили? Подводные камни в студию.


>Успехов.

Взаимно.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32384669
andrew_Pr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SELECT даже полностью оптимизированный РАШМОРОМ работал не быстрее SEEK - DO WHILE,
Не верю, честно, не верю. Тест в качестве доказательства можете представить?


Я то же могу подтвердить, что SEEK + WHILE на больших таблицах,
работает быстее, чем Select. На личном опыте убеждался не однократно.
Тест предоставить? А куда вам скинуть 60МВ табличку для теста? :)

Хотя в примере MaestroEv, я бы использовал не
Do while .T.
if ...
insert into временная ...

а
Seek(...)
Copy to временная while ...
-так будет еще быстрее.

Но любой из этих вариантов все равно лучше, чем SET Filter,
тем более, что со временем, я думаю, увеличатся и число записей
и число пользователей.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32384758
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, насчёт
DO WHILE .T. + IF внутри
- это очень не карашо :( В смысле мендленно.
А вот
SEEK() + SCAN WHILE
, или
SEEK() + DO WHILE с_правильным_условием
конечно будут быстрее SELECT-а. Ибо как бы ни был быстро сишный код, но всё-же ручная оптимизация получше будет нежели автоматическая :)
Совсем иной вопрос, что писать всю оптимизацию вручную - это тот ещё геморр. Ну и естественно прежде чем заниматься ручной оптимизацией следует подумать, создать индексы, перестроить SELECT SQL чтоб он использовал эти индексы и проверить скорость. Ибо выигрыш может оказаться не столь и большим, чтоб заморачиваться.
WBR, Igor
...
Рейтинг: 0 / 0
SET FILTER TO
    #32384943
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 andrew_Pr:

>Я то же могу подтвердить, что SEEK + WHILE на больших таблицах,
работает быстее, чем Select. На личном опыте убеждался не однократно.
Тест предоставить? А куда вам скинуть 60МВ табличку для теста? :)

Помилуйте, барин, зачем же мне ваши 60Mb? У меня своих предостаточно.:)

2 Igor Korolyov

> А вот
SEEK() + SCAN WHILE
, или
SEEK() + DO WHILE с_правильным_условием

Хорошо поиграем в игру "а что у вас?":

1) Генерируем таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	create table free_table.dbf free (num i, name c( 128 )) 
	=rand(- 1 )
	for i= 1  to  400000 
		insert into free_table values (( 2 ^ 31 - 1 )*rand(), sys( 2015 ))
	endfor
	select free_table
	index on num tag num
	index on name tag name


После генерации у меня получилась DBF 53Mb + CDX около 7 MB. Разместил таблицу на сервере.

2) Пишем синтетический тест:
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
	
clear 
clear all

use y:\free_table in  0  order num

set talk off
set delete on
set near on
set printer to log.txt
set printer on

=rand(- 1 )
lnLow = int(( 2 ^ 31  - 1 )*rand())
lnHigh = int(( 2 ^ 31  - 1 )*rand())
if lnLow > lnHigh
	lnTemp = lnHigh
	lnHigh = lnLow
	lnLow = lnTemp
endif
?  "NUM BETWEEN " , lnLow,  " AND " , lnHigh

for i =  0  to  3 
	?  "SEEK + DO WHILE" 
	create cursor temp (num i, name c( 128 ))
	lnStart = seconds()	
	select free_table
	=seek(lnLow)
	do while num <= m.lnHigh .and. !eof()
		insert into temp values (free_table.num, free_table.name)
		skip
	enddo
	lnRecCount = reccount('temp')
	use in temp
	
	lnEnd = seconds()	
	? i, lnEnd - lnStart, lnRecCount

	?  "SELECT" 	
	lnStart = seconds()		
	select num, name ;
	from free_table ;
	where num between lnLow and lnHigh ;
	into cursor temp nofilter
	lnRecCount = reccount('temp')
	use in temp
	
	lnEnd = seconds()	
	
	? i, lnEnd - lnStart, lnRecCount
		
endfor
set printer off
set printer to
clear all


3) На выходе получаем log.txt (450 Пень, 128 Mb, Сетка 10Mb/sec):


NUM BETWEEN 599652426 AND 1777539394
SEEK + DO WHILE
0 117.715 219448
SELECT
0 37.771 219448
SEEK + DO WHILE
1 90.627 219448
SELECT
1 48.857 219448
SEEK + DO WHILE
2 94.953 219448
SELECT
2 45.858 219448
SEEK + DO WHILE
3 97.617 219448
SELECT
3 46.449 219448


4) Отбрасываем самую лучшую и самую худшую разницу. По-моему, что-то не то с SEEK+DO WHILE, а у Вас?
...
Рейтинг: 0 / 0
SET FILTER TO
    #32385365
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>MaestroEv
>Проблема возникает когда кто-то модифицирует записи - остальные получат
>сообщение Record Not Aviable и на какой-то миг все повиснет...

А можно подробнее о такой ситуации? Похоже у меня такая проблема. Записи отбираются по SET FILTER. На одой из машин (единственной на 10 МБ) пару раз в день вылетает: RECORD OUT RANGE. Я никак не могу отловить причину.
...
Рейтинг: 0 / 0
SET FILTER TO
    #32385384
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Анатолий Широков

У меня аналогично на больших таблицах и медленной сети получалось seek+do while быстрее :) Лично я это связывал с тем, что при больших базах данных работа происходит с диском, а не с кэшем... Ну а Ваш пример не показателен - отобрать 200000 записей в таблицу, конечно-же будет быстрее с помощью команды select :) Надеюсь, Вы поняли почему...

Удачи!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SET FILTER TO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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