2010-05-07 3 views
4

검색 할 수있는 10 개의 열이있는 표가 있습니다 (표 자체에는 약 20 개의 열이 있음). 따라서 사용자는 적어도 하나의 열에 대해 쿼리 조건을 입력하지만 가능한 열 모두에 대해 쿼리 조건을 입력합니다. 모든 비어 있지 않은 기준은 다음과 상태에 넣고Postgres의 여러 varchar 열에 가장 적합한 색인 전략

, 컬럼 및 column4에 대한 사용자 제공 비어 있지 않은 조건을 가정하고 쿼리가 될 것 column8 :

select * from the_table 
where column1 like '%column1_query%' 
and column4 like '%column4_query%' 
and column8 like '%column8_query%' 

그래서 내 질문은 : 더 나은 I 오전 10 컬럼으로 1 인덱스 생성? 각 열이 1 개인 10 개의 색인? 또는 어떤 열 집합이 자주 함께 쿼리되는지 확인하고 인덱스를 생성해야합니다 (위의 경우 열 1,4 및 8의 인덱스).

10 개 열의 단일 색인은 모든 10 개 열이 조건에있는 경우에만 효과적입니다.

여기에 제안 사항이 있으면 테이블의 행 개수가 약 20-30K 행만 될 것으로 예상되지만 테이블의 모든 검색이 빠르다는 것을 확인하고 싶습니다.

감사합니다.

답변

2
  1. "가장 자주 사용되는 열 집합을 찾고 색인을 생성하십시오"는 것이 가장 좋습니다. 또한

    2 개 기준에 따라 인덱스의 열을 순서 : 절 우선 더 선택적인 우선 순위가

  2. 열이 곳에서 더 빈번

    • 열.

      예. 만약 "COL1은 = val1과는 여기서"임의의 값 val1과 2 행의 평균을 반환하지만 "COL2 = val2만큼이 곳"평균 2000 개 행을 반환, COL1은 지금까지 인덱스

  3. 초기 인 것으로 우선 순위를 가져야한다

    Postgres에 대해서는 잘 모르겠지만 Sybase에서는 like '%xxx%' 표현식 (예 : 일치 값이 와일드 카드로 시작)은 절대 적중하지 않습니다. 따라서 해당 열을 선택하지 않으면 색인에서 해당 쿼리를 지원할 수 없으므로이를 포함 인덱스로 만듭니다.

2

인덱스를 사용하지 할 수있는 와일드 카드 앞에 모든 쿼리 필터 조건 [부기는 괜찮 즉 'ABC %']

1

조회 열이 동일한 순서에있는 경우 PostgreSQL의 인덱스를 사용하는 것 where 절 및 인덱스 10 열 모두의 인덱스가 정상적으로 작동합니다.

그러나 쿼리 된 텍스트의 양쪽에 와일드 카드가 일치하는 경우 인덱스의 이점을 얻을 수 없습니다.

사용자 제공 입력의 양쪽에 와일드 카드가 필요한 경우 PostgreSQL의 전체 텍스트 모듈을 사용하여 색인을 생성하는 것이 더 합리적입니다.

http://www.postgresql.org/docs/8.3/static/textsearch.html은 좋은 출발점입니다.

관련 문제