Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Фильтрация в БД


Автор: WaReZMEN 22.2.2008, 01:42
Вот раскажите как в lingvo так быстро слова фильтруются??? там же дофига слов... я вот базу сделал из 300000 слов так задержка заметная (около 2-3 сек). (База на Файрберде).  Делал фильтрами на датасети долго делел процедурои в запросе но это тож долго так как после присваеванич параметра приходится переоткрывать датасет. Порекамендуите что нибудь.

Автор: Poseidon 22.2.2008, 09:38
Хотелось бы увидеть код твоих "фильтров". Мне приходилось работать с БД в пол миллиона записей, и обычный SELECT делал выборку за секунду (правда база была Oracle, но, думаю, это не существенно). Показывай чо ты там делаешь, может дело не в базе, а в алгоритме

Автор: X-Vlad 22.2.2008, 11:19
Цитата

Хотелось бы увидеть код твоих "фильтров". Мне приходилось работать с БД в пол миллиона записей, и обычный SELECT делал выборку за секунду (правда база была Oracle, но, думаю, это не существенно). Показывай чо ты там делаешь, может дело не в базе, а в алгоритме 


многое зависит от архитектуры базы..  smile
ну и смотря что ты вибирал )))) например  
Код

select top(1) * from ...

 будет делать за секунду smile)))))


а насчет лингво я недумаю что он это все читает с файла или базы.. он загружает в память а потом уже там ищет. (ИМХО)

Автор: WaReZMEN 24.2.2008, 02:45
Пробовал делать так
Код

  Dm.qDS.Close;
  Dm.qDS.FindParam('IN_WORD').AsString:=Edit1.txt;
  Dm.qDS.Open;

Сами понимаете на Change Edit1 выполняется этот кусок кода. Ща  покажу select он кстате процедура в Фаирберде...
Код

    SELECT    ID,  WORD, LANGUAGE FROM  GET_WORD(:IN_WORD,  :LANGUAGE)
 
Код процедуры
Код

CREATE PROCEDURE GET_WORD (
    in_word varchar(150))
returns (
    id integer,
    word varchar(1000),
    language integer)
as
begin
     LANGUAGE=null;
     For Select ID, Word    From get_english_word(:IN_WORD)  Into :id, :word
       Do
         Begin
           LANGUAGE=0;
           Suspend;
         End
    LANGUAGE=null;
    For Select ID, Word  From GET_RUSSIAN_WORD(:IN_WORD) INTO :ID,:WORD
       Do
         Begin
          LANGUAGE=1;
           Suspend;
         End

end

Код процедуры GET_RUSSIAN_WORD(:IN_WORD) (процедура get_english_word(:IN_WORD) точно такаяже как и GET_RUSSIAN_WORD(:IN_WORD))

Код

CREATE PROCEDURE GET_RUSSIAN_WORD (
    in_word varchar(150))
returns (
    id integer,
    word varchar(150))
as
begin
  For Select ID, Word From spr_russian_word Where upper(Word) Like (:IN_WORD)||'%' Order by Word into :ID, :Word
  Do
  Begin
    Suspend;
  End
end

Все это работает довольнотоки долго... хочется быстрее ... пробовал делать так

При старте проги гружу все слова сразу потом делаю FetchAll и просто фильтрую с помощью датасета вот так:

Код


procedure TDM.qDictionaryFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept:=(Pos(Fmain.FindWord,AnsiUpperCase(DataSet.FieldByName('WORD').AsString))=1);
end;

Автор: WaReZMEN 26.2.2008, 01:04
Ну что поможет ктонибудь?

Автор: Esperito 27.2.2008, 23:03
Вообще-то при вводе букв нужного слова существует некоторая задержка перед переходом. То есть, если юзер клацает по клавиатуре быстрее этой задержки, то переход не производится. А у тебя получается, что переход осуществляется после ввода каждой буквы, так ведь?

Автор: WaReZMEN 28.2.2008, 01:06
Esperito, обсалютно верно! Но ведь в томже лингво он осуществляется маментально даже не самирая на сикунду.

Автор: Deniz 28.2.2008, 07:31
Цитата(WaReZMEN @  26.2.2008,  04:04 Найти цитируемый пост)
Ну что поможет ктонибудь? 
легко, только начнем с указания правильных данных.

Как это понимать?
Код

SELECT    ID,  WORD, LANGUAGE FROM  GET_WORD(:IN_WORD,  :LANGUAGE)

Код

CREATE PROCEDURE GET_WORD (
    in_word varchar(150))
returns ...
в запросе передаешь 2 параметра, в процедуре только 1 входной?
Лучше фильтровать не в программе по OnFilterRecord, а SQL запросом.
Вся проблема в том, что не используются индексы. Предложения по изменению:
1. В таблице spr_russian_word(и всех похожих) добавить поле WordUPPER и хранить там upper(Word).
2. В таблице spr_russian_word(и всех похожих) добавить индекс по WordUPPER.
3. Заменить Like на Starting with
Код

 For Select ID, Word From spr_russian_word Where WordUpper starting with :IN_WORD Order by WordUpper into :ID, :Word
  Do
  Begin
    Suspend;
  End

Делай, далее посмотрим на сколько увеличилось быстродействие.

Автор: WaReZMEN 29.2.2008, 09:35
Цитата(Deniz @  28.2.2008,  15:31 Найти цитируемый пост)
Как это понимать?


Код

SELECT    ID,  WORD, LANGUAGE FROM  GET_WORD(:IN_WORD,  :LANGUAGE)


так и понимать это выборка из процедуры а не из таблицы...

Цитата(Deniz @  28.2.2008,  15:31 Найти цитируемый пост)

в запросе передаешь 2 параметра, в процедуре только 1 входной?


Ну это просто затупил когда писал в форум smile в селекте тож на самом деле 1 параметр IN_WORD

Цитата(Deniz @  28.2.2008,  15:31 Найти цитируемый пост)

Вся проблема в том, что не используются индексы. Предложения по изменению:
1. В таблице spr_russian_word(и всех похожих) добавить поле WordUPPER и хранить там upper(Word).
2. В таблице spr_russian_word(и всех похожих) добавить индекс по WordUPPER.
3. Заменить Like на Starting with


По поводу индексов скажу так они есть но согласно анализу плана каторый показывает IBExpert ни имеют ни какого смысла. Спасибо за советы седня попробую и сразу отпишусь о результатах.

Автор: Deniz 29.2.2008, 11:33
Цитата(WaReZMEN @  29.2.2008,  12:35 Найти цитируемый пост)
так и понимать это выборка из процедуры а не из таблицы...
это я знаю. Вопрос касался разницы в кол-ве параметров запроса и процедуры.

Цитата(WaReZMEN @  29.2.2008,  12:35 Найти цитируемый пост)
По поводу индексов скажу так они есть но согласно анализу плана каторый показывает IBExpert ни имеют ни какого смысла. 
правильно, потому что:
Код
select ... from ... where field like :param
никогда не будет использовать индекс. Сказать почему или сам догадаешься?

Автор: WaReZMEN 5.3.2008, 08:28
Цитата(Deniz @  29.2.2008,  19:33 Найти цитируемый пост)
никогда не будет использовать индекс. Сказать почему или сам догадаешься? 

Это я понимаю... вообщем воспользовался твоими предложениями прирост заметен и вполне удволетворяет мои потребностям smile Вообщем спасибо!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)