![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зависает FireBird [D6, IB6.x, FireBird]
galexis © (2004-08-18 11:27:00)Поиск в БД идет несколько минут (1-2 минуты). Особо нетерпеливые пользователи, видя что программа не реагирует на их дейтвия вырубают ее по ctrl+alt+del. После чего зависает FireBird Server на сервере. Точнее в службах написано, что он работает, а подключится к нему не удается. Приходится останавливать службу и запускать ее заново. Что не так?
Спасибо.
Sergey13 (2004-08-18 12:34:00) [21]2 [13] Sergey_Masloff (18.08.04 12:30)
У автора
>Идет поиск с помощью Like в поле VARCHAR длиной 400
Для 400 таких слов штук 40 с гаком может быть. Если записей прилично, то... 8-(
galexis (2004-08-18 12:31:00) [22]
> Соловьев ©
я и перевожу сначало все в верхний регистр. Это значит что мне без % надо искать?
Sergey_Masloff (2004-08-18 12:30:00) [23]galexis © (18.08.04 12:17) [12]
>А каким образом словарь формировать? Отдельной программкой
Почему отдельной? Зависит от используемой "стратегии"
Это можно делать при вставке каждой записи. Логика может быть реализована как на клиенте так и на сервере (если он поддерживает) - как ХП или триггер например. Неважно.
В твоей ситуации может быть будет какая-то утилитка (отдельная или вмонтированая в программу) которая пробежит по имеющейся базе и построит словарь.
Суть ты (я думаю) понял - строка разбивается на слова и незначащие (ООО, АОЗТ, ТОО и так далее а также предлоги) - выкидываем. Значащие пишем в отдельную таблицу - словарь в которой три (например) поля - ID (уникальный) PARENTID (ссылка на ключ основной таблицы) и VALUE (слово)
Таблица MAIN
ID NAME
1 АОЗТ Рога И Копыта
Таблица DICTIONARY
ID PARENTID VALUE
1 1 РОГА <-- Регистр ВСЕГДА один!!!
2 1 КОПЫТА
В поиске пляшешь от словаря
galexis (2004-08-18 12:17:00) [24]
> Digitman ©
Программист я хреновый, т.к. занимаюсь этим от случая к случаю. Давно хотел сделать поиск как в IB Expert. Но не умею. Мне бы где подробнее почитать про эти нити и т.д. Я даже не все понял, про что вы написали НД, ХП. ХП -хранимая процедура? НД-?
> Sergey_Masloff
Да я и сам знаю что хреновый программист. Но какой уж есть. Тем более что в нашей организации их вообще нет, а я системный администратор наверно. А каким образом словарь формировать? Отдельной программкой?
Соловьев (2004-08-18 12:13:00) [25]
> OUNDEX его давно придумали американцы
это понятно - для нечеткого поиска. я про другое говорил.
Anatoly Podgoretsky (2004-08-18 12:11:00) [26]Соловьев © (18.08.04 12:06) [9]
SOUNDEX его давно придумали американцы
Соловьев (2004-08-18 12:06:00) [27]
> на фиг в словарь идет две записи "Рога" и "Копыта". Первый
> поиск идет по словарю возвращаешься по ссылкам на основнуютаблицу
> проверяя процент соответствия. Это решение лежащее на поверхности.
Да, и еще хочу добавить, что как правило то исчут без учета регистра - так вот в справочнике еще предусмотреть несколько полей, одно как есть, а другое в верхнем регистре - и искать без % с начала, тогда можно индекс подключить
Sergey_Masloff (2004-08-18 12:01:00) [28]galexis © (18.08.04 11:53) [6]
>Поиск на вхождение слова или части слова по всей строке. Это БД >юр. лиц. Обычно ищут то, чего сами не знают.
Если ты ищешь лайком с процентиком впереди то лучше им искать другого программиста. Не обижайся, но мир суров.
Для описаной тобой задачи имеются совершенно другие способы. Могу сказать что у нас поиск по многомиллионной базе клиентов по нечеткому критерию идет ну 2-3 секунды. Причем найдет даже если ты вместо Иванов ищешь Ивнов например (ну ошибся при вводе). Но это так, уже мерянье.
По сабжу реализуй словарь и поиск через него. Типа название ООО Рога и Копыта -> ООО на фиг в словарь идет две записи "Рога" и "Копыта". Первый поиск идет по словарю возвращаешься по ссылкам на основнуютаблицу проверяя процент соответствия. Это решение лежащее на поверхности.
Digitman (2004-08-18 11:54:00) [29]
> Не могу особо тупых пользователей поменять
они далеко не всегда тупые, просто они как правило излишне ретивые)
и вот предупредить их ретивость ты вполне бы мог внесением специальной логики в свою программу
мало того, ты как программер обязанпредусматривать подобные ситуации !
1. Предусмотри возможность изменения привелегий твоего процесса, так чтобы его снятие с выполнения было возможно только с административными или иными спец.правами
2. Вынеси потенциально "тяжелый" запрос в доп.трэд, чтобы не занимать им осн.трэд
3. Вынеси формирование НД по этому запросу в ХП
В сам запрос добавь проверку значения специально созданного тобой генератора
for select .... into ... where .... and GEN_ID(GEN, 0) = 0do suspend;
перед обращением к ХП сбрось генератор GEN в 0
обратись к ХП (т.е. стартуй запрос) в доп.треде, в осн.трэде выведи модальное окошко с прогресс-баром или анимацией и кнопкой ОТМЕНА
когда ретивый юзер устанет ждать, он кликнет на кнопке ОТМЕНА, при этом ты стартуешь еще один доп.тред, задача которого - инкрементировать генератор GEN
как только при выборке очер.записи ХП обнаружит условие GEN_ID(GEN, 0) <> 0, выполнение запроса немедленно и корректно прекращается, и метод StoredProc.Open, вызванный в доп.треде, немедленно возвратит управление
galexis (2004-08-18 11:53:00) [30]
> Соловьев ©
Поиск на вхождение слова или части слова по всей строке. Это БД юр. лиц. Обычно ищут то, чего сами не знают.
> Desdechado ©
Может и так. Но обычно запрос длится не более 2 минут. А после отрубания программы, FireBird и через 30 минут не работает. Да и сервак достаточно мощный двухпроцессорный на Xion 2,4 ГГц, 2Гб оперативки, RAID и т.д. Фирменный - IBM.
Desdechado (2004-08-18 11:42:00) [31]так и сервер наверно не зависает, а продолжает этот запрос обрабатывать, может, даже захватывая все ресурсы процессора
Соловьев (2004-08-18 11:42:00) [32]
> Идет поиск с помощью Like в поле VARCHAR длиной 400
не помню там требовалось только поиск с начала строки или по всей?
Anatoly Podgoretsky (2004-08-18 11:40:00) [33]Докладную записку директору
galexis (2004-08-18 11:36:00) [34]Да по этому поиску я тут уже общался. Идет поиск с помощью Like в поле VARCHAR длиной 400. И окошко есть, и курсор на часы с SQL поменял. Не могу особо тупых пользователей поменять.
Соловьев (2004-08-18 11:28:00) [35]
> Поиск в БД идет несколько минут (1-2 минуты).
вывести окошко. Идет поиск :)
И интересно посмотреть на этот поиск - что же там можно 2 минуты делать то?