【问题标题】:Inner join on regexes正则表达式的内部连接
【发布时间】:2010-06-05 00:30:07
【问题描述】:

我在正则表达式上有一个内部连接 ​​- 它非常慢。有什么简单的方法可以加快速度吗?我正在使用postgres。

FROM A
inner join B ON trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' '))) = trim(lower(A.keyphrase))
             OR trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' '))) ~ (trim(lower(A.keyphrase)) || '$')
             OR trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' '))) ~ (trim(lower(A.keyphrase)) || ' ')

【问题讨论】:

  • Alex:你得到你想要的答案了吗?如果是这样,你能接受吗?如果没有,你能澄清一下你还在寻找什么吗?通常,您提供的信息越多,就越有可能有人可以帮助您。

标签: sql regex postgresql join


【解决方案1】:

有什么简单的方法可以加快速度吗?

性能受到影响的原因是所有操作,更不用说正则表达式,它们必须执行才能进行匹配。您需要简化关系,以便不需要执行这些操作。

【讨论】:

  • 确实看起来您的架构需要重新考虑。加入这样的表达式总是很慢。您可以(可能,我不知道您的完整架构)使用派生表绕过问题以限制完成的工作,但这不是解决方案。
  • 功能索引可以提供帮助,但您确实需要重新考虑需要这样做的设计。
【解决方案2】:

我将从放置以下结果开始:

修剪(降低(替换(替换(替换(B.enginequery,',',''),''',''),'+','')))

放入表格中的一列。至少那时人们不必重复计算它。我不知道你如何在 postgres 中实现它。在 Ms sql server 中,我会尝试计算列,这样我的应用程序就不必知道更新 B.enginequery 及其清理版本。

然后,我可能最终会尝试在清理后的列上建立索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多