Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтрация в БД 
:(
    Опции темы
WaReZMEN
Дата 22.2.2008, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



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

PM MAIL ICQ   Вверх
Poseidon
Дата 22.2.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 3
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
X-Vlad
Дата 22.2.2008, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 570
Регистрация: 10.4.2002
Где: Украина, Львов

Репутация: 3
Всего: 5



Цитата

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


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

select top(1) * from ...

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


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


--------------------
Хорошая штука - комп..:)
www.x-vlad.com
PM MAIL WWW ICQ   Вверх
WaReZMEN
Дата 24.2.2008, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Пробовал делать так
Код

  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;

PM MAIL ICQ   Вверх
WaReZMEN
Дата 26.2.2008, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Ну что поможет ктонибудь?
PM MAIL ICQ   Вверх
Esperito
Дата 27.2.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: 2
Всего: 3



Вообще-то при вводе букв нужного слова существует некоторая задержка перед переходом. То есть, если юзер клацает по клавиатуре быстрее этой задержки, то переход не производится. А у тебя получается, что переход осуществляется после ввода каждой буквы, так ведь?
PM MAIL   Вверх
WaReZMEN
Дата 28.2.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Esperito, обсалютно верно! Но ведь в томже лингво он осуществляется маментально даже не самирая на сикунду.
PM MAIL ICQ   Вверх
Deniz
Дата 28.2.2008, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(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

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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
WaReZMEN
Дата 29.2.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



Цитата(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 ни имеют ни какого смысла. Спасибо за советы седня попробую и сразу отпишусь о результатах.
PM MAIL ICQ   Вверх
Deniz
Дата 29.2.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



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

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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
WaReZMEN
Дата 5.3.2008, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



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

Это я понимаю... вообщем воспользовался твоими предложениями прирост заметен и вполне удволетворяет мои потребностям smile Вообщем спасибо!!!!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.