Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.04.03;
Скачать: [xml.tar.bz2];

Вниз

Что лучше , filter или locate ?   Найти похожие ветки 

 
Grey   (2003-03-14 11:29) [0]

Сначала использовал в запросах locate для выбора нужной записи, но ввиду больших тормозов перешёл на фильтр , тормоза исчезли, но приятель говорит , что использование фильтров не есть хорошо, потому что на слабых машинах будет жутко тормозить, т.к. якобы фильтр проходит все записи и проверяет на удовлетворению условий причем все это на стороне клиента, чем больше записей и медленней комп тем хуже.
Рассудите нас пожалуйста, Мастера.


 
Anatoly Podgoretsky   (2003-03-14 11:35) [1]

Ты путаешь апельчины с ананасами
Первое это поиск, а второе фильтрация и они никак не связаны по функциональности.
И то и другое проходит по записям, и то и другое делается на клиенте, и то и другое может тормозить, и то и другое зависит от скорости компьютера, количества памяти.
Для выбора нужной записи надо использовать Select * from table where условие, вот это будет делаться на сервере и будет работать быстро.

Вам обоим в книжный магазин за книгами, только потом включать компьютер. :-)


 
Grey   (2003-03-14 11:51) [2]

>Anatoly Podgoretsky

Знаю я что locate это поиск, а filter фильтрация и они никак не связаны по функциональности, главное - что результат получается одинаковый , что с filter , что с locate.

Думаю, что Select * from table where условие тоже будет тормозить , т.к. это используется в OnCalcFields и если постоянно открывать/закрывать запрос, то будет ещё тормознее.

Попутный вопрос:
Правда, что чтобы получить запись , используя фильтр, нужно все записи просмотреть, а lоcate бежит по индексу до нужной (т.е. как бы быстрее) ?

Кстати ошибся в наборе БД, БД - не MySQL, а MSSQL.


 
Anatoly Podgoretsky   (2003-03-14 12:00) [3]

Результат никак не может получаться одинаковым, абсолютно никак.
Настоятельно советую в магизин.
Неправда в общем, но может быть правда для MySQL
Опять фильтрация и перемещение курсора абсолютно ортогональные вещи как по внешнему результату так и назначению.
Lоcate можешь применить к перемещению курсора на отфильтрованной таблице, обратное дикий абсурд.

MSSQL - одназначно SELECT WHERE в ответ одну и только одну запись, ту которую ты бы указал в Lоcate

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

Вам обоим не хватает знания теории.


 
zacho   (2003-03-14 12:01) [4]


> Попутный вопрос:
> Правда, что чтобы получить запись , используя фильтр, нужно
> все записи просмотреть, а lоcate бежит по индексу до нужной
> (т.е. как бы быстрее)

В клиет-серверных СУБД на клиенте ни каких индексов нет ! Соответственно, и Locate работает простым перебором всех записей.

> т.к. это используется в OnCalcFields

Что-то не в порядке у тебя с постановкой задачи. Может тебе нужно тривиальное Master-Detail ?


 
NickBat   (2003-03-14 12:04) [5]

> Anatoly Podgoretsky © (14.03.03 12:00)
> Применять навигационные методы к реляционным данным, как кто то сказал, это даже не прошлый век, а каменный.

Зачем же так категорично? Иногда пользователю гораздо быстрее получить набор данных из 10 записей и потом бегать по ним на своей машине, чем каждый раз заново посылать серверу запрос на выборку ТОЛЬКО одной записи.


 
NetKnight   (2003-03-14 12:10) [6]

Во-первых это разные вещи,
Во-вторых locate - это и есть select <field> from <table> where <condition>
В третьих locate не использует индексы.
В третьих locate - вещь унивирсальная и работает на любой БД (в отличии от FindKey, который использует индексы)

Если интересно, могу кинуть универсальный компонент для поиска в базе слеланый на основе TEdit и использующий самый быстрый метод в зависимоти от БД.


 
Anatoly Podgoretsky   (2003-03-14 12:22) [7]

Если надо получить набор, да пожаулйста, затем по нему можно локально бегать
Первое это фильтр (ограничение выборки), для клиент серверных через Where ...
Второе это перемещение по локальному курсору

NetKnight © (14.03.03 12:10)
Кроме во-первых остальное неверно
Во-вторых locate это никак не то, что ты написал, а перемещение по локальному набору.

В третьих locate использует индексы, если они доступны.


 
Grey   (2003-03-14 12:28) [8]

> zacho ©
Master-Detail не подходит, т.к. OnCalc используется в lookup полях , при изменении поля сразу должен быть виден результат в другом поле

>Anatoly Podgoretsky ©
да знаю я что делает filter и locate
конечно результат в общем не одинаковый , но фильтром я выделяю 1 запись , также как и locate выделяет одну.

Попробую конечно SELECT WHERE , но не думаю, что быстрее будет, надо же на каждую запись будет обращаться к серверу за данными (открывать / закрывать запрос).



 
zacho   (2003-03-14 12:33) [9]


> OnCalc используется в lookup полях

Покажи код этого OnCalc. А то я не понял, что оно делает и зачем это нужно.


 
NetKnight   (2003-03-14 12:42) [10]

--> Anatoly Podgoretsky
Согласен насчёт во-вторых, что-то я наоборот про фильтрацию написал..
И индексы тоже использует... Только что код просмотрел...
Пора врачам сдаваться.. :)


 
Grey   (2003-03-14 12:43) [11]

>zacho ©
Вот код :

procedure TMainForm.InputQueryCalcFields(DataSet: TDataSet);
begin
wh_01_Order_filter.Filter:="OrgCode="+QuotedStr(InputQuerywh_01_Order_complex_key.Value);
wh_01_Order_filter.Filtered := true;
InputQueryCustomer_name.Value:=wh_01_Order_filterdcCustomer_name.Value;
InputQueryAddress.Value:=wh_01_Order_filterdcCustomerAddress_Address.Value;
InputQueryContract.Value:=wh_01_Order_filterdcContract_description.Value;

if (not InputQuerywh_01_Order_whGood_ID.IsNull
AND not InputQuerywh_01_Order_whPriceList_ID.IsNull) then
begin
whGoodPrice_filter.Filter:="whGoodPrice_whGood_ID="+InputQuerywh_01_Order_whGood_ID.AsString+ " AND "+
"whGoodPrice_whPriceList_ID="+InputQuerywh_01_Order_whPriceList_ID.AsString;
whGoodPrice_filter.Filtered := true;
InputQueryprice.Value :=whGoodPrice_filterwhGoodPrice_result_price.Value;
end;
InputQuerytotal.Value :=InputQueryprice.Value * InputQuerywh_01_Order_quantity.Value;
if not InputQuerywh_01_Order_whGood_ID.isNull then
begin
whGood_filter.Filter:="whGood_ID="+InputQuerywh_01_Order_whGood_ID.AsString;
whGood_filter.Filtered :=true;
InputQueryGood_name.Value := whGood_filterwhGood_name.Value;
InputQuerytotal_with_NDS.Value := InputQuerytotal.Value + InputQuerytotal.Value*0.01*whGood_filterwhGood_NDS_rate.Value;
InputQueryNDS_rate.Value := whGood_filterwhGood_NDS_rate.Value;
InputQueryweight.Value := whGood_filterwhGood_gross_weight.Value*InputQuerywh_01_Order_quantity.Value;
end
end;



 
zacho   (2003-03-14 12:48) [12]

Детально в твой код пока не вникал, но у меня сложилось впечатление, что тебе нужны тривиальные lookup поля вместо calculated или join в запросе. И не придется извращаться с locate или фильтром


 
Grey   (2003-03-14 12:53) [13]

>zacho ©
join не подойдёт, т.к. он выводит уже введённую запись. а мне надо на этапе редактирования


 
zacho   (2003-03-14 12:59) [14]


> а мне надо на этапе редактирования

Не совсем понял эту фразу. Напиши конкретней, как тебе надо что бы работало. А чем lookup поля не устраивают ?


 
Grey   (2003-03-14 13:13) [15]

>zacho ©

Не совсем понял эту фразу. Напиши конкретней, как тебе надо что бы работало.



ввожу новую запись , используя lookup поля , когда изменяю данные в lookup поле , перемещаясь по lookupdataset, в другом поле данные должны сразу же изменяться , до сохранения записи,т.е. ввводим в одной колонке в гриде из выпадающего списка 1 , должно подставлять в другую колонку "номер1" из таблицы соответствия
1 "номер 1"
2 "номер 2"
.........



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.04.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
14-6712
Ahmad K
2003-03-15 23:40
2003.04.03
Что такое


7-6811
GrBob
2003-02-07 21:07
2003.04.03
Запрет доступа к часам?


8-6618
aleks_igor
2002-12-31 08:25
2003.04.03
графика


14-6780
dor
2003-03-17 18:05
2003.04.03
мне надь чтоб при запуске проги она сворачивлалась в трей,Rx есть


14-6667
Alibaba
2003-03-14 17:01
2003.04.03
Телепорт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский