POSTGRES 不同,就像慢

kof*_*fus 1 postgresql

我们在 POSTGRES 上有以下查询

SELECT DISTINCT Doctor 
FROM Table 
WHERE (LOWER(Doctor) SIMILAR TO 'dr[.,][ !^]ab%' 
       OR LOWER(Doctor) SIMILAR TO 'dr[., !^]ab%' 
       OR LOWER(Doctor) SIMILAR TO 'dr[., !^] _ ab%' 
       OR LOWER(Doctor) SIMILAR TO 'mr[.,][ !^]ab%' 
       OR LOWER(Doctor) SIMILAR TO 'mr[., !^]ab%' 
       OR LOWER(Doctor) SIMILAR TO 'mr[., !^] _ ab%' 
       OR LOWER(Doctor) SIMILAR TO 'ms[.,][ !^]ab%' 
       OR LOWER(Doctor) SIMILAR TO 'ms[., !^]ab%' 
       OR LOWER(Doctor) SIMILAR TO 'ms[., !^] _ ab%' 
       OR LOWER(Doctor) SIMILAR TO 'ab%')
Run Code Online (Sandbox Code Playgroud)

显然这是一个相当繁重的查询。我们在 Doctor 字段上有一个索引,但在大型数据集上这仍然需要 3-5 秒,这是一个问题(我们在搜索医生姓名时使用它来自动完成)。

有什么办法可以加快这个速度吗?

Tim*_*sen 5

感谢您可以在此处使用单个不区分大小写的正则表达式模式:

SELECT DISTINCT Doctor
FROM yourTable
WHERE Doctor ~* '^((dr|mr|ms)(([\.,][\s!^])|[\.,\s!^])(\s.\s)?)?ab';
Run Code Online (Sandbox Code Playgroud)

这避免了必须进行如此多的正则表达式检查,并且还避免了将列小写的需要Doctor