2009-03-30 3 views
5

PostgreSQL 8.3.3에서 character varying(256) 유형의 열에 대해 정규식 일치를 수행합니다. 현재 열에는 색인이 없습니다. 가능한 경우이 쿼리의 성능을 향상시키고 싶습니다.PostgreSQL 8에서 정규 표현식 쿼리의 성능을 향상시킬 수있는 방법은 무엇입니까?

색인을 추가 할 수 있습니까? 실적 향상에 도움이 될 수있는 다른 것들이 있습니까?

+0

정규식이 어떻게 보이는지에 대한 자세한 정보가 도움이 될 것입니다. 또한 열에있는 데이터는 무엇입니까? –

+0

필드가 정규식과 일치하는지 여부를 반환하고 새 필드/테이블 또는 트리거를 만들 필요가없는 함수 (및 기능 인덱스)를 만듭니다. – MkV

답변

5

일반 정규식의 속도를 높일 수있는 인덱스를 만들 수 없습니다. 그러나 일치하는 정규 표현식이 하나 또는 제한적일 경우 몇 가지 옵션이 있습니다.

Paul Tomblin이 언급했듯이 추가 행을 사용하여 주어진 행이 해당 정규 표현식 또는 정규 표현식과 일치하는지 여부를 나타낼 수 있습니다. 해당 열을 인덱싱하고 쿼리 할 수 ​​있습니다. 당신보다 더 가고 싶은 경우

this paper 그 후보의 일치를 생성 할 텍스트의 존재 여부에 따라 정규식 및 인덱싱 긴 문자열을 찾고 포함 정규식에 대한 인덱싱에 대한 흥미로운 사운드 기술에 대해 설명합니다. 이는 실제로 정규 표현식을 검사해야하는 행 수를 줄입니다. 아마도 이것은 GiST 개의 인덱스를 사용하여 구현할 수 있지만, 이는 사소한 작업 일 것입니다.

4

색인은 정규 표현식으로는 아무 것도 수행 할 수 없습니다. 당신은 전체 테이블 스캔을해야 할 것입니다.

항상 동일한 정규 표현식을 쿼리하는 경우처럼이 행이 해당 정규 표현식과 일치하는지 여부를 지정하고 삽입 및 업데이트시 해당 행을 유지할 수있는 열을 추가 할 수 있습니다.

0

정규식 일치는 상당히 큰 텍스트 열에서는 잘 수행되지 않습니다. 정규식없이이 작업을 수행하거나 데이터 세트가 크지 않은 경우 코드에서 일치 작업을 수행하십시오.

0

RegEx를 사용하지 않을 때가 있습니다. 당신의 reg-ex 코드는 어떻게 생겼습니까? 어쩌면 그 속도를 높이는 방법 일 수 있습니다.

0

일치하는 정규식 집합이있는 경우 테이블의 기본 키와 해당 정규 표현식과 일치하는지 나타내는 필드를 만들 수 있습니다.이 정규 표현식은 트리거에서 업데이트 한 다음 테이블 키를 인덱싱합니다 그 테이블에 이것은 select에서 아마도 큰 속도 증가를위한 업데이트 및 삽입 속도의 작은 감소를 가져옵니다.

또는 필드를 해당 정규식과 비교하거나 함수와 일치하는 필드와 함께 정규식을 전달하는 함수를 작성한 다음 해당 함수에 대해 테이블에 기능 색인을 작성할 수 있습니다. 이것은 또한 고정 된 정규식 세트를 가정합니다 (그러나이 방법으로 새로운 정규식 일치를 더 쉽게 추가 할 수 있습니다).

정규식이 사용자 입력에서 동적으로 생성되는 경우 필드에 인덱스를 사용하는 것이 '값 %' 같은 필드와 같은 더 간단한 검색을 생산하기 위해 테이블 ​​스캔과 함께 생활하거나 사용자 응용 프로그램을 변경해야 할 수도 있습니다 ('% value %').

0

간단한 LIKE 쿼리로 필요를 줄이려면 text_pattern_ops를 사용하여 인덱스를 검색하여 속도를 높이십시오.