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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


>Успехов.

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


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

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

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

Но любой из этих вариантов все равно лучше, чем SET Filter,
тем более, что со временем, я думаю, увеличатся и число записей
и число пользователей.
...
Рейтинг: 0 / 0
22.01.2004, 14:43
    #32384758
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET FILTER TO
Да, насчёт
DO WHILE .T. + IF внутри
- это очень не карашо :( В смысле мендленно.
А вот
SEEK() + SCAN WHILE
, или
SEEK() + DO WHILE с_правильным_условием
конечно будут быстрее SELECT-а. Ибо как бы ни был быстро сишный код, но всё-же ручная оптимизация получше будет нежели автоматическая :)
Совсем иной вопрос, что писать всю оптимизацию вручную - это тот ещё геморр. Ну и естественно прежде чем заниматься ручной оптимизацией следует подумать, создать индексы, перестроить SELECT SQL чтоб он использовал эти индексы и проверить скорость. Ибо выигрыш может оказаться не столь и большим, чтоб заморачиваться.
WBR, Igor
...
Рейтинг: 0 / 0
22.01.2004, 16:16
    #32384943
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET FILTER TO
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
22.01.2004, 22:35
    #32385365
vl2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET FILTER TO
>MaestroEv
>Проблема возникает когда кто-то модифицирует записи - остальные получат
>сообщение Record Not Aviable и на какой-то миг все повиснет...

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

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

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


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