1

, 내 모든 쿼리는 장고에 의해 만들어집니다, 그래서 내가 더 필기 질문이 없습니다.전체 텍스트 인덱스는 내가 장고를 사용하고

: 고객이 꽤 실수의 버전을 단축 할 수 말했다 subscriberno 이후

BillRecords.objects.filter(subscriberno__icontains='123456') 

...

필터가 같은 쿼리를 출력 : 내 장고 필터에서, 나는 같은 필터링 쿼리를 사용

SELECT "subscriberno" FROM "BillRecords" WHERE UPPER("subscriberno"::text) LIKE UPPER(E'%123456%'); 

subscriberno은 일부 숫자에 alphas와 일부 특수 문자가 포함되어 있기 때문에 char 필드입니다.

내 데이터베이스에는 동료가 만든 해당 열에 대해 두 개의 인덱스가 있습니다. 나는 그런 쿼리에 대한 두 개의 인덱스를 사용하여 궁금

"BillRecords_subscriberno" btree (subscriberno) 
"BillRecords_fsubscriberno_like" btree (subscriberno varchar_pattern_ops) 

는 논리적이다. 우리 장고 필터는 모두 icontains을 사용하고 위와 같이 작성 쿼리를 작성해야합니다.

Seq Scan on BillRecords (cost=0.00..159782.40 rows=370 width=15) (actual time=579.637..3705.079 rows=10 loops=1) 
Filter: (upper((subscriberno)::text) ~~ '%123456%'::text) 
Total runtime: 3705.106 ms 
(3 rows) 

그래서, 지금까지 내가 보는 바와 같이, 인덱스를 사용하지 다음과 같이

포스트 그레스 쿼리의 분석이다. 인덱스 usega는 데이터 삽입 및 업데이트에 비용이 필요하기 때문에 사용법이없는 두 개의 인덱스가 있습니다. (이 분석에서 볼 수있는 한) 논리적이지 않습니다.

django가 비슷한 icontanis 필터에 대해 다른 쿼리를 출력 할 수있는 channce가 있습니까? 또는 내 색인은 전혀 쓸모가 없습니까?

답변

1

비 묶음 성명에 색인을 사용할 수 없습니다.

upper(foo) like 'bar%' -- index on upper(foo) 
upper(foo) like '%bar' -- no index 
reverse(upper(foo)) like 'rab%' -- index on reverse(upper(foo)) 
upper(foo) like '%bar%' -- no index 

그러나 검색 창을 줄이려면 trigram contrib을 사용할 수 있습니다.

1

포함 (연산자가 전체 텍스트 모듈에 연결되어 있지 않은 경우) 쿼리는 인덱스에 액세스 할 수 없습니다. 다른 한편으로 시작 쿼리는 인덱스의 이점을 얻을 수 있습니다. 카디널리티가 너무 낮지 않고 삽입이 일반적으로 대량 배치에서는 수행되지 않지만 OLTP 시나리오에서는 인덱싱 오버 헤드가 무시해도됩니다.

통계를 올바르게 읽습니까? 거의 4 초, 370 행을 스캔합니까?

P. 예를 들어 구독자 이름의 처음 세 문자에 연결된 subscriberno의 마지막 네 문자에 대해 함수 기반 색인을 사용하고 검색 용어에 LIKE 대신에 starts-with 또는 equals를 사용하는 방법을 고려할 수 있습니다 와일드 카드로 예약.

+0

실제로 PostgreSQL 9.1은 'like'% foo % ''를 사용하여 "contains"쿼리에 대한 색인을 사용할 수 있습니다. http://www.depesz.com/index.php/2011/02/19/waiting-for-9-1-faster-likeilike/ –

+0

@a_horse_with_no_name : 오른쪽 - 오. 나는 (전체 텍스트 모듈 또는 다른 종류의 문자열 토크 나이저에 링크되어 있지 않다면) 추가해야한다. – Tim

+0

나는 구독자 이름을 사용할 수 없다.) : 내가 가지고있는 모든 것은 __subscriberno__이다. 이것은 다른 구독 유형에 관한 정보를 보유하고있는 "일종의 시스템"이다. 그래서 다양한 구독 형식이 있고 몇 가지 서식이 몇 가지에 적용된다. 그들의... – FallenAngel

1

하여 인덱스를 전혀 사용되었는지 확인하는 간단한 방법은 모든 쿼리 당신이 보여주는 것과 같은 경우, 그들은 확실히 사용되지 않습니다,

SELECT * FROM pg_stat_user_indexes; 

보는 패턴 때문입니다 고정되어 있지 않습니다. 이 문제를 해결하려면 전체 텍스트 검색, trigram 또는 그와 비슷한 것을 사용하여 약간의 검색을 다시 수행해야합니다.