Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 模式匹配性能问题Postgres_Postgresql_Pattern Matching - Fatal编程技术网

Postgresql 模式匹配性能问题Postgres

Postgresql 模式匹配性能问题Postgres,postgresql,pattern-matching,Postgresql,Pattern Matching,我发现下面这样的查询需要更长的时间,因为这种模式匹配会影响批处理作业的性能 查询: select a.id, b.code from table a left join table b on a.desc_01 like '%'||b.desc_02||'%'; 我已经尝试使用LEFT、STRPOS函数来提高性能。但最后,如果我应用这些函数,我会丢失一些数据 请提供任何其他建议。您的数据(或结构)的真实外观并不清楚,但您的搜索正在执行包含比较。这不是最简单的优化,因为标准索引和许

我发现下面这样的查询需要更长的时间,因为这种模式匹配会影响批处理作业的性能

查询:

select a.id, b.code
from table a
left join table b
      on a.desc_01  like '%'||b.desc_02||'%';
我已经尝试使用LEFT、STRPOS函数来提高性能。但最后,如果我应用这些函数,我会丢失一些数据


请提供任何其他建议。

您的数据(或结构)的真实外观并不清楚,但您的搜索正在执行包含比较。这不是最简单的优化,因为标准索引和许多匹配算法都偏向于字符串的开头。如果以%开头,则B-树无法有效使用,因为它基于字符串的前面进行拆分/分支

根据您真正想要搜索的方式,您是否考虑过三元索引?他们非常棒。字符串被分成三个字母块,这克服了左锚定文本比较的许多问题。原因很简单:现在每个字符都是一个短的、左锚定块的开始。传统上有两种生成三角图(n-gram)的方法,一种是带前导填充,另一种是不带前导填充。Postgres使用填充,这是更好的默认设置。我最近在一个可能与您相关的问题上得到了帮助:

如果您想要更像关键字匹配的东西,那么全文搜索可能会有所帮助。我没有太多地使用它们,因为我有一个数据集,将单词转换为“词素”是没有意义的。事实证明,您可以告诉解析器改用“简单”字典,这样就可以得到一个唯一的单词列表,而无需任何词干转换。最近有一个问题:

如果这听起来更像你需要的,你可能还想摆脱停止/跳过/噪音词。关于如何设置,我认为文档中有一个更清晰的线索(这并不难):


长期的解决办法是清理和重新组织数据,这样您就不需要这样做了

使用索引可能是短期的答案

create extension pg_trgm;
create index on a using gin (desc_01 gin_trgm_ops);

这将有多快取决于b.desc_02中的内容。

在此联接中,我没有其他可匹配的键列。表b是主表,其中包含代码和详细说明列表。如果表a的描述与主表b匹配,那么我需要从表b中获取描述代码。
a.desc_01~b.desc_02
?您好404,我尝试了这个,但仍然存在相同的性能问题。亲爱的@morris de Oyrx,感谢您的回复。我将通过共享的链接。此外,表a中的数据类似于desc_01='Parts of automobiles',表b[主表]中的数据类似于code is:code01和desc_02='autombiles',将动态比较数据并得到code01。事实上,表a将有超过100万条记录,并将继续增长。