![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Медленно работает LIKE [D7, FireBird 1.5]
galexis © (2006-06-22 10:28:00)Используется запрос типа select * from Table Where (Fld1 LIKE '%' || 'Text' || '%')
Данные Fld1 (тип VarChar длина 1000) состоят из нескольких слов (наименовние предприятий).
Так вот. Ищу, например, "Горьковский автомобильный завод" по одному слову "автомобильный". Запрос выполняется меньше секунды. Пытаюсь провести поиск по неполному слову, например, "горьковск" - и тут все, поиск идет минут 20.
Чего бы это?
Johnmen (2006-06-22 13:06:00) [61]http://www.sql.ru/forum/actualthread.aspx?tid=244770
galexis (2006-06-22 12:59:00) [62]
> Johnmen ©
А для многопользовательского варианта?
Johnmen (2006-06-22 12:56:00) [63]Прервать выполнение запроса можно, как уже ты говорил, с использованием генератора (с приведёнными Sergey13 © и Desdechado © оговорками), использую ХП, в которой цикл FOR SELECT с отслеживанием генератора, и уже обращаться SELECT'ом к этой процедуре.
galexis (2006-06-22 12:51:00) [64]Да и как еще можно по другому прервать выпонение запроса?
galexis (2006-06-22 12:50:00) [65]
> Desdechado © (22.06.06 12:35) [23]
Может и так. Но тогда почему запросы мгновенно возвращают то, что уже успели отобрать? А не висят дальше, как еслибы запрос выполнялся полностью?
Desdechado (2006-06-22 12:35:00) [66]> Запрос не прервется, ИМХО. Просто записи перестанут отбираться.
Именно. Перебор продолжится, только в результат уже ничего не попадет.
Desdechado (2006-06-22 12:34:00) [67]> select ... where .... and GEN_ID(GEN_TH, 0) = 1
Строго однопользоывательский вариант.
> при загрузке из xml файла разбивать длинные названия по словам, но пока времени нет.
На нет и суда нет. Мучься дальше.
> индексы можно сделать на поле длиной не более 40 символов
Зависит от COLLATION и числа байтов в нем. Подробности на ibase.ru
Sergey13 (2006-06-22 12:33:00) [68]> [17] galexis (22.06.06 12:26)
Никогда такого не видел. 8-)
А если не один человек что-то ищет?
Запрос не прервется, ИМХО. Просто записи перестанут отбираться.
sniknik (2006-06-22 12:31:00) [69]> Запрос прерывается, так как не выполняется условие
скорее всего нет, т.к. условие вычисляется только один раз, при старте запроса. (надо проверить)
alexeis (2006-06-22 12:31:00) [70]не более 82 при win1251 по моему :-)
ну да все одно не 1000
8-)
galexis (2006-06-22 12:28:00) [71]
> alexeis ©
индексы можно сделать на поле длиной по моему не более 40 символов, а у меня 1000
galexis (2006-06-22 12:26:00) [72]
> Sergey13 ©
А вы как запрос прерываете? Запрос выполняется в фоне. Структура такая select ... where .... and GEN_ID(GEN_TH, 0) = 1
Из основного потока (по нажатию кнопки Отмена) ставлю генератор в 0. Запрос прерывается, так как не выполняется условие
alexeis (2006-06-22 12:23:00) [73]а индексы есть по этому полю?
galexis (2006-06-22 12:22:00) [74]
> sniknik ©
Данные в базу в моей организации никто не набивает, они поступают ежемесячно в виде xml файла, потому псевдонимы набивать некому. Остается только справочники написать, т.е. при загрузке из xml файла разбивать длинные названия по словам, но пока времени нет.
из 80 тыс уникальны 80 тыс. Это база данных предприятий всех форм собственности
Sergey13 (2006-06-22 12:20:00) [75]2 [12] galexis (22.06.06 12:13)
> Сделал бэкап/ресторе. База уменьшилась на 12 Мб.
Это нормально.
> И вот еще чего странно. Так как поиск в фоне, то для отмены
> выполнения запроса устанавливаю значение генератора в 0.
Это как?
sniknik (2006-06-22 12:17:00) [76]переделок с псевдонимами будет больше чем просто вынести название в справочник... набивать их... + их еще и запоминать народу нужно (не у всех есть "интуитивно понятный"), хотя вот для таких вот "интуитивных" идея хорошая.
а сколько из этих 80 тыс. уникальных названий?
galexis (2006-06-22 12:13:00) [77]Сделал бэкап/ресторе. База уменьшилась на 12 Мб.
И вот еще чего странно. Так как поиск в фоне, то для отмены выполнения запроса устанавливаю значение генератора в 0. Выполнение прерывается только спустя пять минут или больше. То что значение скинулось в ноль проверяю IBExpert.
Sergey13 (2006-06-22 12:04:00) [78]> [10] Desdechado © (22.06.06 12:00)
> Например, для "Горьковский автомобильный завод" могут быть
> псевдонимы "ГАЗ", "авто", "автомобиль" ...
"Волга" забыл. 8-)
Desdechado (2006-06-22 12:00:00) [79]Поиски по Like '%...' не используют индексов.
> "Горьковский автомобильный завод" по неполному слову "горьковск"
C текстом запроса, который приведен в [0], ты вообще не найдешь. Значит, делаешь UPPER для поля и искомой строки, а это очень долго.
Поэтому предлагаю как вариант: завести таблицу псевдонимов для каждой строки справочника и искать по ней строгое соответствие, а если нет, тогда уже по основной нестрогое. 1 завод - несколько псевдонимов.
Например, для "Горьковский автомобильный завод" могут быть псевдонимы "ГАЗ", "авто", "автомобиль" ...
Sergey13 (2006-06-22 11:16:00) [80]2[7] galexis (22.06.06 11:09)
>Ресторе не делал, попробовать?
Обязательно!!! Это надо делать с каждым бекапом. Только это дает уверенность, что бекап работоспособный. Только восстанавливать надо не в рабочую БД, а в отдельную.
2 [6] sniknik © (22.06.06 11:08)
>ага, и где это у нас 80 тыс различных автомобильных заводов? или вообще заводов?
Там могут быть не только автозаводы и не только заводы вообще.