Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

Медленно работает LIKE   Найти похожие ветки 

 
galexis   (2006-06-22 10:28) [0]

Используется запрос типа select * from Table Where (Fld1 LIKE "%" || "Text" || "%")

Данные Fld1 (тип VarChar длина 1000) состоят из нескольких слов (наименовние предприятий).
Так вот. Ищу, например, "Горьковский автомобильный завод" по одному слову "автомобильный". Запрос выполняется меньше секунды. Пытаюсь провести поиск по неполному слову, например, "горьковск" - и тут все, поиск идет минут 20.
Чего бы это?


 
Sergey13 ©   (2006-06-22 10:35) [1]

>Медленно работает LIKE
Это нормально.

>и тут все, поиск идет минут 20.
Велика ли таблица? Б/Р нормально проходят?


 
galexis   (2006-06-22 10:43) [2]

Таблица по которой LIKE - 80 тыс. записей.
Запрос я конечно упростил до некуда, на самом деле выборка идет из порядка 50 таблиц. Но в данном случае меняется только одно слово поиска.
Б/Р - это что?


 
sniknik ©   (2006-06-22 10:46) [3]

> Ищу, например, "Горьковский автомобильный завод"
по правильному это строковое название не должно присутствовать в основной таблице в куче записей... надо делать отдельный справочник названий, в основной только ссылки на него. тогда и размер базы будет меньше, и поиск будет в меньшей таблице происходить, а выборка по связке с ключевым полем будет "летать"...
в общем почитай про нормализацию баз данных. (поиск, google)


 
galexis   (2006-06-22 10:53) [4]


> sniknik ©

Я в курсе про справочник. Сначала база была небольшая, теперь руки не доходят, но сделаю обязательно.
Совсем недавно такие запросы выполнялись быстро, около 30 секунд и это устраивало пользователей. Ничего в программе не менял, в базе тоже и вот такая фигня. Чем отличается поиск по целому слову от поиска по части слова? Поле то одно и тоже.


 
Sergey13 ©   (2006-06-22 10:54) [5]

2 [2] galexis   (22.06.06 10:43)
> Таблица по которой LIKE - 80 тыс. записей.
Не так и много, в принципе.

> Запрос я конечно упростил до некуда, на самом деле выборка
> идет из порядка 50 таблиц.
И без LIKE он не тормозит? 50 таблиц - что-то многовато, ИМХО. Это надо умудриться такой написать. 8-) У меня больше 10-15 редко-редко встречается. Не слишком ли занормализована БД?
Конкретно приведенный запрос тормозит при смене слова поиска?

> Б/Р - это что?
Бекап/рестор.

2 [3] sniknik ©   (22.06.06 10:46)
>по правильному это строковое название не должно присутствовать в основной таблице в куче записей... надо делать отдельный справочник названий

Не факт. Зависит от задачи. Может это и есть справочник. 8-)


 
sniknik ©   (2006-06-22 11:08) [6]

> Не факт. Зависит от задачи. Может это и есть справочник. 8-)
ага, и где это у нас 80 тыс различных автомобильных заводов? или вообще заводов?
думал про это, но не похоже. (у нас справочники товаров меньше бывают... а тут заводы которые их производят...)

по вопросу
а "Горьковский" также быстро ищется, или  только "автомобильный"? и потом проверки делались на том запросе который показан или "оригинале"?


 
galexis   (2006-06-22 11:09) [7]


> Sergey13 ©

Да, один и тот же запрос, меняется только фраза поиска. Чем она длинее, тем быстрее поиск, чем короче, тем медленнее. В принципе так и должно, но разница у слишком большая. Структура базы навязана свыше :)

Бэкап делаю раз в месяц, после обновления базы. Ресторе не делал, попробовать?


 
galexis   (2006-06-22 11:13) [8]


> sniknik ©


> а "Горьковский" также быстро ищется, или  только "автомобильный"?
>  и потом проверки делались на том запросе который показан
> или "оригинале"?

Любое предприятие по целому слову ищется быстро, по двум и более тоже, а вот по неполному резко время поиска увеличивается. Если поиск отменить (поиск в фоне идет), то требуемое предприятие тоже находится.


 
Sergey13 ©   (2006-06-22 11:16) [9]

2[7] galexis   (22.06.06 11:09)
>Ресторе не делал, попробовать?
Обязательно!!! Это надо делать с каждым бекапом. Только это дает уверенность, что бекап работоспособный. Только восстанавливать надо не в рабочую БД, а в отдельную.

2 [6] sniknik ©   (22.06.06 11:08)
>ага, и где это у нас 80 тыс различных автомобильных заводов? или вообще заводов?
Там могут быть не только автозаводы и не только заводы вообще.


 
Desdechado ©   (2006-06-22 12:00) [10]

Поиски по Like "%..." не используют индексов.

> "Горьковский автомобильный завод" по неполному слову "горьковск"
C текстом запроса, который приведен в [0], ты вообще не найдешь. Значит, делаешь UPPER для поля и искомой строки, а это очень долго.

Поэтому предлагаю как вариант: завести таблицу псевдонимов для каждой строки справочника и искать по ней строгое соответствие, а если нет, тогда уже по основной нестрогое. 1 завод - несколько псевдонимов.
Например, для "Горьковский автомобильный завод" могут быть псевдонимы "ГАЗ", "авто", "автомобиль" ...


 
Sergey13 ©   (2006-06-22 12:04) [11]

> [10] Desdechado ©   (22.06.06 12:00)
> Например, для "Горьковский автомобильный завод" могут быть
> псевдонимы "ГАЗ", "авто", "автомобиль" ...

"Волга" забыл. 8-)


 
galexis   (2006-06-22 12:13) [12]

Сделал бэкап/ресторе. База уменьшилась на 12 Мб.

И вот еще чего странно. Так как поиск в фоне, то для отмены выполнения запроса устанавливаю значение генератора в 0. Выполнение прерывается только спустя пять минут или больше. То что значение скинулось в ноль проверяю IBExpert.


 
sniknik ©   (2006-06-22 12:17) [13]

переделок с псевдонимами будет больше чем просто вынести название в справочник... набивать их... + их еще и запоминать народу нужно (не у всех есть "интуитивно понятный"), хотя вот для таких вот "интуитивных" идея хорошая.

а сколько из этих 80 тыс. уникальных названий?


 
Sergey13 ©   (2006-06-22 12:20) [14]

2 [12] galexis   (22.06.06 12:13)
> Сделал бэкап/ресторе. База уменьшилась на 12 Мб.
Это нормально.

> И вот еще чего странно. Так как поиск в фоне, то для отмены
> выполнения запроса устанавливаю значение генератора в 0.

Это как?


 
galexis   (2006-06-22 12:22) [15]


> sniknik ©

Данные в базу в моей организации никто не набивает, они поступают ежемесячно в виде xml файла, потому псевдонимы набивать некому. Остается только справочники написать, т.е. при загрузке из xml файла разбивать длинные названия по словам, но пока времени нет.

из 80 тыс уникальны 80 тыс. Это база данных предприятий всех форм собственности


 
alexeis ©   (2006-06-22 12:23) [16]

а индексы есть по этому полю?


 
galexis   (2006-06-22 12:26) [17]


> Sergey13 ©

А вы как запрос прерываете? Запрос выполняется  в фоне. Структура такая select ... where .... and GEN_ID(GEN_TH, 0) = 1

Из основного потока (по нажатию кнопки Отмена) ставлю генератор в 0. Запрос прерывается, так как не выполняется условие


 
galexis   (2006-06-22 12:28) [18]


> alexeis ©

индексы можно сделать на поле длиной по моему не более 40 символов, а у меня 1000


 
alexeis ©   (2006-06-22 12:31) [19]

не более 82 при win1251 по моему :-)
ну да все одно не 1000
8-)


 
sniknik ©   (2006-06-22 12:31) [20]

> Запрос прерывается, так как не выполняется условие
скорее всего нет, т.к. условие вычисляется только один раз, при старте запроса. (надо проверить)


 
Sergey13 ©   (2006-06-22 12:33) [21]

> [17] galexis   (22.06.06 12:26)

Никогда такого не видел. 8-)
А если не один человек что-то ищет?
Запрос не прервется, ИМХО. Просто записи перестанут отбираться.


 
Desdechado ©   (2006-06-22 12:34) [22]

> select ... where .... and GEN_ID(GEN_TH, 0) = 1
Строго однопользоывательский вариант.

> при загрузке из xml файла разбивать длинные названия по словам, но пока времени нет.
На нет и суда нет. Мучься дальше.

> индексы можно сделать на поле длиной не более 40 символов
Зависит от COLLATION и числа байтов в нем. Подробности на ibase.ru


 
Desdechado ©   (2006-06-22 12:35) [23]

> Запрос не прервется, ИМХО. Просто записи перестанут отбираться.
Именно. Перебор продолжится, только в результат уже ничего не попадет.


 
galexis   (2006-06-22 12:50) [24]


> Desdechado ©   (22.06.06 12:35) [23]

Может и так. Но тогда почему запросы мгновенно возвращают то, что уже успели отобрать? А не висят дальше, как еслибы запрос выполнялся  полностью?


 
galexis   (2006-06-22 12:51) [25]

Да и как еще можно по другому прервать выпонение запроса?


 
Johnmen ©   (2006-06-22 12:56) [26]

Прервать выполнение запроса можно, как уже ты говорил, с использованием генератора (с приведёнными  Sergey13 © и Desdechado © оговорками), использую ХП, в которой цикл FOR SELECT с отслеживанием генератора, и уже обращаться SELECT"ом к этой процедуре.


 
galexis   (2006-06-22 12:59) [27]


> Johnmen ©

А для многопользовательского варианта?


 
Johnmen ©   (2006-06-22 13:06) [28]

http://www.sql.ru/forum/actualthread.aspx?tid=244770


 
galexis   (2006-06-22 13:23) [29]

С восстановленной базой работать стало еще хуже.
1. Ввожу "Нижегородская электрическая компания". Запрос выпоняется 390 мс. Находится одно предприятие с полным названием Закрытое акционерное общество "Нижегородская электрическая компания".
2. Ввожу "электрическая компания". И вот уже 20 минут выполняется.
Чего случилось то? Все понимаю, UPPER, LIKE, все долго, но не настолько же!


 
galexis   (2006-06-22 14:00) [30]

Дождался. Выполнился запрос. Смотрю в IBExpert Perfomance Analysis, а там большая часть времени потрачена на индексный поиск!
Т.е. если я ввожу Нижегородская электрическая компания, то идет неиндексный поиск со временем 80045, а если просто "электрическая компания", то неиндексный поиск все те же 80045, но появляется еще индексный с временем 349 784 353. Чего за хрень то? Может индексы перестроить?


 
Johnmen ©   (2006-06-22 14:01) [31]


> galexis   (22.06.06 13:23) [29]


Есть кое-какие соображения.
Приведи времена для
"%Нижегородская электрическая компания%"
"%ижегородская электрическая компания%"
"%жегородская электрическая компания%"
"%егородская электрическая компания%"
"%городская электрическая компания%"
"%ородская электрическая компания%"
"%родская электрическая компания%"
"%одская электрическая компания%"
"%дская электрическая компания%"
"%ская электрическая компания%"
"%кая электрическая компания%"
"%ая электрическая компания%"
"%я электрическая компания%"
"% электрическая компания%"
"%электрическая компания%"


 
galexis   (2006-06-22 14:21) [32]

"%Нижегородская электрическая компания%"
"%ижегородская электрическая компания%" 25 S 500 MS
"%жегородская электрическая компания%" 27s 125ms
"%егородская электрическая компания%" 27s 406ms
"%городская электрическая компания%" 26s 907ms
"%ородская электрическая компания%" 27s 500ms
"%родская электрическая компания%" 26s 63ms
"%одская электрическая компания%"  27s 281ms
"%дская электрическая компания%" 26s 609ms
"%ская электрическая компания%"  26s 594ms
"%кая электрическая компания%" 26s 657ms
"%ая электрическая компания%"  27s 578ms
"%я электрическая компания%" 27s 953ms
"% электрическая компания%"
"%электрическая компания%"

Пока все, очередной запрос выпоняется уже 2 минуты


 
Johnmen ©   (2006-06-22 14:22) [33]

И ещё замерь
"%лектрическая компания%"


 
galexis   (2006-06-22 14:25) [34]

Может сам FireBird конфигурировать надо?


 
galexis   (2006-06-22 14:26) [35]


> Johnmen ©   (22.06.06 14:22) [33]

не могу, все еще "% электрическая компания%"
выполняется


 
Johnmen ©   (2006-06-22 14:28) [36]

Дело не в кофигурации.
Всё-таки тесты проведи...


 
galexis   (2006-06-22 14:31) [37]

вот уже 12 минут выполняется "% электрическая компания%"
Может отменить?


 
Johnmen ©   (2006-06-22 14:49) [38]

Конечно отменяй! Давно пора. Если время превышает 2-3 мин, то снимай...


 
galexis   (2006-06-22 14:56) [39]

ну вот, а я 33 прождал


 
galexis   (2006-06-22 15:03) [40]

все остальные запросы уходят за 2 минуты и я их отменяю



Страницы: 1 2 3 вся ветка

Форум: "Базы";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.044 c
1-1153379746
Лапыч
2006-07-20 11:15
2006.09.03
Потокозащищенный список строк


15-1155176950
TButton
2006-08-10 06:29
2006.09.03
logout


2-1155147831
Коля
2006-08-09 22:23
2006.09.03
TADOTable


2-1155311676
ArtemESC
2006-08-11 19:54
2006.09.03
Хочу написать компонент...


15-1155287138
flad
2006-08-11 13:05
2006.09.03
Читать тексты(книги)на ДВД-проигрывателе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский