Улучшение запроса "% LIKE%" к базе данных Firebird - PullRequest
4 голосов
/ 25 января 2012

Ситуация:

Я пытаюсь написать эффективный запрос, используя инструкцию "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.

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

Ответы [ 2 ]

7 голосов
/ 25 января 2012

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

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

3 голосов
/ 25 января 2012

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

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

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

...