有什么方法可以提高PostgreSQL 8中正则表达式查询的性能?

时间:2009-03-30 20:56:08

标签: sql regex performance postgresql

我正在PostgreSQL 8.3.3中的character varying(256)类型的列上执行正则表达式匹配。该列目前没有索引。如果可以,我想提高此查询的性能。

是否会添加索引帮助?还有其他我可以尝试帮助提高绩效的方法吗?

6 个答案:

答案 0 :(得分:5)

您无法创建将加速任何通用正则表达式的索引;但是,如果您正在匹配一个或有限数量的正则表达式,那么您有几个选项。

正如Paul Tomblin所提到的,您可以使用额外的一列或多列来指示给定行是否与正则表达式或正则表达式匹配。该列可以编入索引,并有效查询。

如果你想更进一步,this paper讨论了一种有趣的声音技术,用于对正则表达式进行索引,这涉及在正则表达式中查找长子串并根据文本中是否存在这些子索引来生成索引以生成候选人比赛。这会过滤掉实际需要检查正则表达式的行数。您可以使用GiST索引来实现这一点,尽管这将是一项非常重要的工作。

答案 1 :(得分:4)

索引无法对正则表达式执行任何操作。你将不得不进行全表扫描。

如果可能的话,就像你一直在查询相同的正则表达式一样,你可以添加一个列,指定该行是否与该正则表达式匹配,并在插入和更新时保持该行。

答案 2 :(得分:0)

正则表达式匹配在相当大的文本列上表现不佳。尝试在没有正则表达式的情况下完成此操作,或者如果数据集不大则在代码中进行匹配。

答案 3 :(得分:0)

这可能是您不想使用RegEx的时间之一。您的注册代码是什么样的?也许这是一种加快速度的方法。

答案 4 :(得分:0)

如果您有一组有限的正则表达式匹配,您可以创建一个包含表的主键的表和一个表示它是否匹配该正则表达式的字段,您将在触发器上更新,然后将表键入索引那张桌子。这会使更新和插入速度略有下降,以便在select中大幅提高速度。

或者,您可以编写一个函数,将您的字段与该正则表达式进行比较(或者甚至将正则表达式与您与该函数匹配的字段一起传递),然后在您的表上针对该函数创建一个功能索引。这也假设一组固定的正则表达式(但你可以通过这种方式更容易地添加新的正则表达式匹配)。

如果从用户输入动态创建正则表达式,您可能需要使用表扫描或更改用户应用程序以生成更简单的搜索,例如像'这样的字段,这将使用字段上的索引('%value%'不会)。

答案 5 :(得分:0)

如果您确实设法减少了对简单LIKE查询的需求,请使用text_pattern_ops查找索引以加快这些速度。