Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Зависает FireBird [D6, IB6.x, FireBird]


Страницы:   1 2

galexis ©   (2004-08-18 11:27:00) 

Поиск в БД идет несколько минут (1-2 минуты). Особо нетерпеливые пользователи, видя что программа не реагирует на их дейтвия вырубают ее по ctrl+alt+del. После чего зависает FireBird Server на сервере. Точнее в службах написано, что он работает, а подключится к нему не удается. Приходится останавливать службу и запускать ее заново. Что не так?
Спасибо.


galexis   (2004-08-18 15:18:00) [1]

Со словарями все ясно. А с чего начать создание Thread? Где бы подробнее почитать с примерами. Подскажите пожалуйста.


WondeRu   (2004-08-18 14:37:00) [2]

galexis ©   (18.08.04 11:27)
вырубают ее по ctrl+alt+del

отруби ctrl+alt+del! ;-)


Sergey13   (2004-08-18 14:17:00) [3]

2galexis ©
Для попробовать/пошаманить. Сделай доп. поле (80 символов), туда скопируй часть исходного поля (начало). Проиндексируй. Стандартно искать по нему. Если поиск не удовлетворил, то по старой схеме с предупреждением, что "Сами понимаете, на ждать". И плюс [3] для нерадивых.


Sergey_Masloff   (2004-08-18 14:12:00) [4]

Да конечно мой вариант когда надо искать ВСЕ слова введенные пользователем.


Anatoly Podgoretsky   (2004-08-18 14:06:00) [5]

Совпадение может быть полное, по всем словам или не полное по отдельным словам, именно так и строят поиск поисковые машины, для первого используется AND для второго OR


Sergey_Masloff   (2004-08-18 14:00:00) [6]

galexis ©   (18.08.04 13:19) [27]

CREATE TABLE DICTITBL (
   ID        INTEGER NOT NULL,
   PARENTID  INTEGER NOT NULL,
   STRVALUE  VARCHAR(40) NOT NULL
);

CREATE TABLE MAINTABLE (
   ID    INTEGER NOT NULL,
   NAME  VARCHAR(400)
);

ALTER TABLE DICTITBL ADD CONSTRAINT PK_DICTITBL PRIMARY KEY (ID);
ALTER TABLE MAINTABLE ADD CONSTRAINT PK_MAINTABLE PRIMARY KEY (ID);

CREATE INDEX X_DICTI_PARENT ON DICTITBL (PARENTID);
CREATE INDEX X_DICTI_VALUE ON DICTITBL (STRVALUE);

COMMIT WORK;

для всех трех слов

select m.NAME from dictitbl d1 left join dictitbl d2 on d2.parentid = d1.parentid
left join dictitbl d3 on d3.parentid = d1.parentid
left join maintable m on m.id = d1.parentid
where d1.strvalue like 'РУСС%'
and d2.strvalue like 'ПРОМ%'
and d3.strvalue like 'КОМП%'

для двух

select m.NAME from dictitbl d1 left join dictitbl d2 on d2.parentid = d1.parentid
left join maintable m on m.id = d1.parentid
where d1.strvalue like 'РУСС%'
and d2.strvalue like 'КОМП%'

На 60000 записей в главной таблице и 60000 * 5 в словаре работает мгновенно.

Как унифицировать для произвольного числа слов в введенной пользователем строке - твоя работа. У меня это сделано но во-первых сделано в рамках коммерческой разработки и публиковать код я конечно не могу во вторых это уже материал на несколько статей для чего ни времени ни желания ни таланта нет. Но вобщем если подумать реализовать несложно.


Iconka   (2004-08-18 13:43:00) [7]

наверно

...
name = 'Русская'
or name = 'компания'
...


Digitman   (2004-08-18 13:43:00) [8]


> galexis


формирование слов.статей и "индексов" по ним веди в триггерах на вставку/модификацию

каждая слов.статья должна ссылаться на список точных координат ее вхождения в конкретные записи и хэш-таблицу

вообще говоря, хранить данные для поиска лучше всего будет в БЛОБ-поле, а ф-цию поиска (на базе формируемого словаря) осуществлять в UDF, т.к. производительность поиска в БЛОБ-данных ощутимо эффективней, если она ведется в UDF (т.е. алгоритм поиска полностью подконтролен и реализован в оптимизированном маш.коде)


galexis   (2004-08-18 13:19:00) [9]

>Sergey_Masloff
Поиск идет тоже не по одному слову. Например, есть ООО "Русская промышленная компания". Пользователь вводит Русская компания. Каким образом в словаре вести поиск?


Соловьев   (2004-08-18 12:55:00) [10]


> Да я не могу почемуто создать индекс по этому полю

по какому?


Sergey_Masloff   (2004-08-18 12:54:00) [11]

galexis ©   (18.08.04 12:52) [23]
>А как разбивать поле на слова? В голову приходит только >посимвольное копирование до пробела или еще до чего нибудь. >Думаю создание словаря выльется часов в 10.
Да хоть в 100. Это операция одноразовая. Главно потом делать это на каждую вставляемую запись.


Sergey_Masloff   (2004-08-18 12:52:00) [12]

galexis ©   (18.08.04 12:48) [22]
>я не могу почемуто создать индекс
Ну не почему-то а потому что ограничение 255 байт а символы мультибайтовые то есть 255/3 = макс. размер индекса дла русского чарсета

>Записей действительно 60 тыс
Для интербейза это копейки

>Плюс оказывается в названии юр. лиц могут встречаться знаки >препинания, например запятые
Для поиска нужно выкидывать все несущественное. Даже если слов 40 поисковозначимых из них ну 10 (сходу даже пример такой придумать трудно). Как правило 2-5 слов получается в словаре.


galexis   (2004-08-18 12:52:00) [13]


> Sergey_Masloff

А как разбивать поле на слова? В голову приходит только посимвольное копирование до пробела или еще до чего нибудь. Думаю создание словаря выльется часов в 10.


galexis   (2004-08-18 12:48:00) [14]

>Соловьев © Да я не могу почемуто создать индекс по этому полю.

>Sergey13 Записей действительно 60 тыс. И слов много. Плюс оказывается в названии юр. лиц могут встречаться знаки препинания, например запятые.


Соловьев   (2004-08-18 12:42:00) [15]


> На поле 400 символов вроде индекс не повесишь. Там вроде
> ограничение около 80 - не помню. Хотя может я и ошибаюсь.

конечно не повесиш, я мею ввиду таблицу справочник слов.


Sergey13   (2004-08-18 12:40:00) [16]

2[19] Соловьев ©   (18.08.04 12:37)
На поле 400 символов вроде индекс не повесишь. Там вроде ограничение около 80 - не помню. Хотя может я и ошибаюсь.


Соловьев   (2004-08-18 12:37:00) [17]


> Это значит что мне без % надо искать?

where field_dic starting "РОГ" или where field_dic like "РОГ%"
подключит индекс и будет искать все слова которые начинаются на РОГ


Sergey13   (2004-08-18 12:36:00) [18]

2 galexis ©
А что это за поле 400 символов?


Digitman   (2004-08-18 12:36:00) [19]


> НД-?


Набор Данных


Sergey_Masloff   (2004-08-18 12:34:00) [20]

galexis ©   (18.08.04 12:31) [14]
>Это значит что мне без % надо искать
нет но это значит что ты уже на верном пути


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо