正则表达式sql优化
我有一个系统sysB,它存储的名称没有任何关于名称的规则,我还有另一个系统,它的对象具有ids sysA。当数据从sysA到sysB时,放入其中的名称将类似于BIN、id和其他内容 在sysB上,我从sysA获取ID列表,然后执行如下正则表达式查询:正则表达式sql优化,sql,regex,postgresql,Sql,Regex,Postgresql,我有一个系统sysB,它存储的名称没有任何关于名称的规则,我还有另一个系统,它的对象具有ids sysA。当数据从sysA到sysB时,放入其中的名称将类似于BIN、id和其他内容 在sysB上,我从sysA获取ID列表,然后执行如下正则表达式查询: select id from mytable where "mytable"."name"::text ~ '(^BIN-8178-.*)|(^BIN-2345-.*)'; 我注意到,随着列表变大,查询变得非常慢 如果ID列表有800个ID,则查
select id
from mytable
where "mytable"."name"::text ~ '(^BIN-8178-.*)|(^BIN-2345-.*)';
我注意到,随着列表变大,查询变得非常慢
如果ID列表有800个ID,则查询需要18秒
我尝试更改要索引的字段;这没有帮助。
我知道将这个索引作为一个新字段添加到另一个系统可以加快查询速度,但我想知道是否有一种方法可以在不更改模式的情况下加快查询速度。
还请注意,系统是独立的,因此我无法加入。尝试此查询:
select id
from mytable
where "mytable"."name" like 'BIN-8178%'
在mytablename上具有索引。Postgres应该能够为这种相似的模式使用索引
如果正在使用索引,则还应将其用于:
select id
from mytable
where "mytable"."name" like 'BIN-8178%' or
"mytable"."name" like 'BIN-2345%';
但是,索引可能很挑剔,您可能需要使用union all:
您可以尝试使用or或union.pls标记拆分替换。RDBMSI根据::casting运算符和~,添加了postgresql标记。如果您使用的是不同的内容,请删除该标记并为您正在使用的数据库产品添加正确的标记。当您查找以BIN开头的字符串时,可以添加另一个筛选器,其中的名称如“BIN%”可以使用索引。那么正则表达式只需应用于这些行,如果您能向我们展示完整的CREATETABLE语句,包括所讨论的表的所有索引,这将有所帮助。你的问题通过点击下面的链接,它不会把代码放在评论中,比如说代替regex仍然是很慢的;然而,当我使用union all时,它变得更快了。它从20秒下降到100毫秒。thanks@max . . . 这很有趣。Postgres应该足够聪明,可以将索引与or一起使用。我想这还没有实现。
select id
from mytable
where "mytable"."name" like 'BIN-8178%'
union all
select id
from mytable
where "mytable"."name" like 'BIN-2345%';