2016-06-10 4 views
1

У меня низкая производительность при выполнении простого поиска (~ 20-30-х годов):HSQLDB эффективность поиска текста

select Text from Library where REGEXP_MATCHES(Text, '.*abc.*') 
select Text from Library where Text LIKE '%abc%' 

Вот описание моего стола:

  • SELECT COUNT (*) из Библиотека = 1 628 062
  • ВЫБРАТЬ AVG (ДЛИНА (текст)) из библиотеки = 766 символов
  • Library.script файл 2.5GB
  • Текст поле индексируется
  • Я уже сделал SHUTDOWN COMPACT;
  • библиотека является "в памяти" стол

Что-то, что не может быть нормальным:

  • не имеют Library.data или .data файл для этой БД

У меня заканчиваются идеи о том, что делать, чтобы ускорить этот запрос.

Любое предложение?

+1

Ни один из этих запросов не сможет использовать индекс (что также справедливо для почти всех других СУБД, за исключением Postgres). Но полное сканирование всего на 1,6 миллиона строк не должно занимать 30 секунд. Но я не думаю, что вы можете сделать что-то в HSQLDB для ускорения этих запросов. –

ответ

1

Напишите запрос в его простейшей форме.

select text from library where position('abc' in text) > 0 

Я проверил, и это занимает около секунды на 1,5 миллиона строк (но более короткая средняя длина). Он должен принимать меньше, чем те, которые вы пробовали.

+0

Спасибо fredt, это действительно быстрее, чем нравится и regexp. Однако он не так универсален, как, например, или регулярное выражение. Конечно, мы можем использовать позицию в подзапросе в качестве фильтра первого уровня и использовать регулярное выражение в основном запросе в качестве фильтра второго уровня. Вы видите другой путь? –

+1

Нет другого способа, чем вы описали. Он также может работать, если вы используете POSITION (...)> 0 AND REGXP_MATCHES (...), поскольку он обычно применяет фильтры в данном порядке. – fredt

+0

Да, где POSITION ('...' IN ...)> 0 и REGEXP_MATCHES (..., '. *') Дает лучшую производительность и, вероятно, самое элегантное решение: ~ 1.5sec –

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

  • Нет связанных вопросов^_^