2012-01-25 3 views
3

Ситуация:Улучшение «% LIKE%» Запрос на Firebird Database

Я пытаюсь написать эффективный запрос с помощью «LIKE» заявление смотреть после того, как кусок текста в колонку с короткими текстами.

Модель:

Table 'EVENTSGENERAL' : { ID (KEY), GENERATOR_ (FK), DATETIME, COMPUTERNAME, OSLOGIN, DBLOGIN, INFOTYPE, INFO } 

Table 'EVENTSGENERATORS' : { ID (KEY), GENERATOR_ (FK), SHORTNAME, LONGNAME } 

Table 'EVENTSINFOTYPES' : { ID (KEY), GENERATOR_ (FK), VERSION_, INFOTYPE, DESCRIPTION } 

Индексы: EVENTSGENERAL.GENERATOR, EVENTSGENERAL.DATETIME, EVENTSINFOTYPES.INFOTYPE Все по возрастанию.

Мои запросы:

SELECT FIRST @first SKIP @skip A.ID,B.LONGNAME, A.DATETIME, A.COMPUTERNAME,A.OSLOGIN, A.DBLOGIN, C.DESCRIPTION, A.INFO 
FROM EVENTSGENERAL A JOIN EVENTSGENERATORS B ON B.GENERATOR_ = A.GENERATOR_ 
JOIN EVENTSINFOTYPES C ON C.GENERATOR_ = A.GENERATOR_ AND C.INFOTYPE = A.INFOTYPE 
WHERE C.DESCRIPTION LIKE '%VALUE%' 

Проблема:

Этот запрос будет работать на очень больших баз данных. Есть ли способ улучшить его? Я использую базу данных Firebird.

Заранее спасибо.

ответ

7

Нет, к сожалению, нет, потому что вы используете подстановочные знаки (%) по обе стороны от ключевого слова LIKE. Подстановочный знак (начало) означает, что индекс не может использоваться для улучшения скорости поиска, поэтому каждая строка должна быть проверена, чтобы проверить, соответствует ли она критериям.

Вы можете немного ускорить процесс, заменив вместо этого LIKE 'VALUE%'; индекс можно, по меньшей мере, использовать для ограничения поиска строк, начиная с VALUE.

+0

Что изменится, если я использую «LIKE%» вместо этого? Было бы быстрее? –

+0

Если вы имеете в виду LIKE 'VALUE%', вы должны иметь возможность индексировать VALUE для некоторой прибыли от производительности. Вы можете попробовать создать индекс, а затем выполнить эквивалент Filebird «плана объяснения». –

+0

Отредактировано для включения эффекта 'LIKE 'VALUE%'' на скорость запроса. –

3

Полный текстовый поиск (с использованием %VALUE%) медленный, потому что нет эффективного способа сделать это. Это как захват словаря, чтобы составить список всех слов, которые содержат букву Q. Это занимает навсегда. С другой стороны, если вы просто ищете VALUE%, это намного проще (если поле поиска индексируется). Это похоже на составление списка всех слов, которые начинаются с буквой Q. Это легко, если слова отсортированы в алфавитном порядке (например, в словаре). Вы можете легко найти первое и последнее слово, и вы можете быть уверены, что вам нужно все, что между ними, и ничто другое.

Некоторые базы данных допускают полнотекстовый поиск, они могут индексировать каждое слово в столбце, но только полное слово. Поэтому поиск %q% все равно будет медленным, и поиск q% будет быстрее. Я не уверен, поддерживает ли Firebird или нет.

Если у вас есть большая база данных, и вы хотите, чтобы иметь возможность искать %q%, вы должны смотреть на другие, специализированные решения, как Lucene или Xapian

+0

Спасибо за это объяснение, она завершила индексирование базы данных и использование запроса 'Word%' для ускорения работы.Это не то, что я хотел, но, по крайней мере, сейчас помогает. После первого выпуска я могу проверить lucene, чтобы узнать, соответствует ли он моим потребностям. Еще раз спасибо! –

+0

Я вижу, в чем проблема «El Corte Inglés», если я напишу «el», есть способ увеличить размер для «Капитала» или «Нет» –

Смежные вопросы