2010-06-05 2 views
0

정규 표현식에 내부 조인이 있습니다. 매우 느립니다. 이 속도를 낼 수있는 쉬운 방법이 있습니까? 나는 포스트그레스를 사용하고있다.정규식에서 내부 조인

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)) || ' ') 
+0

Alex : 찾고 계신 답변을 받으셨습니까? 그렇다면 그것을 받아 들일 수 있습니까? 그렇지 않다면, 당신이 찾고있는 것을 명확히 할 수 있습니까? 일반적으로 제공하는 정보가 많을수록 누군가가 당신을 도울 가능성이 커집니다. – MaasSql

답변

3

이 속도를 어떤 쉬운 방법이 있습니까?

성능이 저하되는 이유는 정규식은 물론 모든 작업이 일치하는 것으로 수행되어야하기 때문입니다. 관계를 단순화하여 수행 할 필요가 없도록해야합니다.

+0

스키마가 다시 생각해야하는 것처럼 보입니다. 이와 같은 표현에 참여하는 것은 항상 느려질 것입니다. 당신은 (아마도 당신의 전체 스키마를 모른다는) 파생 된 테이블의 문제를 side-step하여 작업을 제한 할 수 있지만 해결책은 아닙니다. – d11wtq

+1

기능적 색인 *은 도움이 될 수 있지만 실제로 필요한 설계를 재고해야합니다. – rfusca

1

나는 결과를 배치하여 시작할 것 :

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

를 테이블의 컬럼에. 적어도 하나는 반복적으로 계산할 필요가 없을 것입니다. 내가 잘 모르는 포스트 그레스에서 그것을 구현하는 방법. MS SQL Server에서 계산 된 열을 사용하여 내 응용 프로그램이 B.enginequery 및 해당 정리 된 버전을 업데이트 할 필요가 없도록했습니다.

그리고 나서, 아마 정리 된 컬럼에서 색인을 작성하려고합니다.