Внутреннее объединение на регулярных выражениях - PullRequest
0 голосов
/ 05 июня 2010

У меня есть внутреннее соединение с регулярными выражениями - оно очень медленное. Есть ли простой способ ускорить это? Я использую 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)) || ' ')

Ответы [ 2 ]

3 голосов
/ 05 июня 2010

Есть ли простой способ ускорить это?

Причина, по которой страдает производительность - это все операции, не говоря уже о регулярном выражении, которые должны быть выполнены только для того, чтобы соответствовать. Вам нужно упростить отношения, чтобы их не нужно было выполнять.

1 голос
/ 25 июня 2010

Я бы начал с размещения результатов:

 trim(lower(replace(replace(replace(B.enginequery,',',' '),'"',' '),'+',' ')))

в столбец в вашей таблице. По крайней мере, тогда не нужно будет повторно рассчитывать это. Как вы реализуете это в postgres, я не знаю. На сервере MS SQL я бы попробовал вычисленный столбец, чтобы мои приложения не знали об обновлении B.enginequery и его очищенной версии.

И тогда я, вероятно, в итоге попытался бы выполнить индекс для этого очищенного столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...