Какими способами я могу улучшить производительность запроса регулярного выражения в PostgreSQL 8? - PullRequest
5 голосов
/ 31 марта 2009

Я выполняю сопоставление с регулярным выражением для столбца типа character varying(256) в PostgreSQL 8.3.3. В данный момент столбец не имеет индексов. Я хотел бы улучшить производительность этого запроса, если смогу.

Поможет ли добавление индекса? Могу ли я попытаться улучшить производительность?

Ответы [ 6 ]

5 голосов
/ 31 марта 2009

Вы не можете создать индекс, который ускорит любое общее регулярное выражение; однако, если у вас есть одно или ограниченное количество регулярных выражений, с которыми вы сопоставляете, у вас есть несколько вариантов.

Как упоминает Пол Томблин, вы можете использовать дополнительный столбец или столбцы, чтобы указать, соответствует ли данная строка этому регулярному выражению или регулярному выражению. Этот столбец можно индексировать и эффективно запрашивать.

Если вы хотите пойти дальше, в этой статье обсуждается интересная техника звучания для индексации по регулярным выражениям, которая включает в себя поиск длинных подстрок в регулярном выражении и индексацию на основе их наличия в текст для генерации совпадений кандидатов. Это отфильтровывает количество строк, с которыми вам действительно нужно проверить регулярное выражение. Вы, вероятно, могли бы реализовать это, используя GiST индексы, хотя это было бы нетривиальным объемом работы.

4 голосов
/ 31 марта 2009

Индекс не может ничего сделать с регулярным выражением. Вам нужно будет выполнить полное сканирование таблицы.

Если это вообще возможно, например, если вы все время запрашиваете одно и то же регулярное выражение, вы можете добавить столбец, который указывает, соответствует ли эта строка этому регулярному выражению, и поддерживать его при вставках и обновлениях.

0 голосов
/ 01 апреля 2009

Если вам удастся сократить ваши потребности до простого запроса LIKE, ищите индексы с text_pattern_ops, чтобы ускорить их.

0 голосов
/ 31 марта 2009

Если у вас есть ограниченный набор регулярных выражений для сопоставления, вы можете создать таблицу с первичным ключом вашей таблицы и полем, указывающим, соответствует ли оно этому регулярному выражению, который вы обновите в триггере, а затем проиндексировать ключ таблиц в этот стол. Это меняет небольшое уменьшение количества обновлений и скорости вставки для вероятно большого увеличения скорости выбора.

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

Если регулярное выражение динамически создается из пользовательского ввода, вам может потребоваться выполнить сканирование таблицы или изменить пользовательское приложение, чтобы создать более простой поиск, например , например поле «значение%» , которое будет использовать индекс по полю ( '% value%' не будет).

0 голосов
/ 31 марта 2009

Это может быть один из тех случаев, когда вы не хотите использовать RegEx. Как выглядит ваш регулярный код? Может быть, это способ ускорить его.

0 голосов
/ 31 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...