@Tregoreg는 제안 된 현상금에 대한 의견에서 질문 을 제기했습니다 .
현재 답변이 작동하지 않습니다. 배열 유형 컬럼에서 GIN 인덱스를 사용하면 ANY () 연산자의 성능이 향상되지 않습니다. 실제로 해결책이 없습니까?
@ 프랭크의 허용 대답은 사용 할 것을 배열 연산자 인, 아직 정확한 포스트 그레스 (11)에 대한 매뉴얼 :
... PostgreSQL의 표준 배포에는 다음 연산자를 사용하여 인덱스 된 쿼리를 지원하는 배열에 대한 GIN 연산자 클래스가 포함되어 있습니다.
<@
@>
=
&&
표준 배포판의 GIN 인덱스에 대한 내장 연산자 클래스의 전체 목록은 다음과 같습니다.
Postgres에서 색인은 데이터 유형이나 함수 또는 다른 것이 아닌 연산자 (특정 유형에 대해 구현 됨)에 바인딩됩니다 . 그것은 Postgres의 원래 버클리 디자인의 유산 이며 지금은 변경하기가 매우 어렵습니다. 그리고 그것은 일반적으로 잘 작동합니다. Tom Lane이 pgsql-bugs에 대한 주석을 작성했습니다.
(와 같은 ) 일부 PostGis 함수는ST_DWithin()
이 원칙을 위반하는 것으로 보이지만 그렇지 않습니다. 이러한 함수는 각 연산자 를 사용하기 위해 내부적으로 다시 작성 됩니다.
색인화 된 표현식은 연산자 의 왼쪽 에 있어야합니다 . 위의 모든 것을 포함하여 대부분의 연산자의 경우 인덱스 플래너를 정의한대로 오른쪽에 배치하면 쿼리 플래너가 피연산자를 뒤집어이를 달성 할 수 있습니다 COMMUTATOR
. ANY
구조체는 다양한 연산자 병용 조작자 자체 없다 할 수있다. 배열 요소constant = ANY (array_expression)
에서 =
연산자를 지원하는 인덱스로만 사용될 경우에 대한 정류자가 필요합니다 . GIN 지수가 부족합니다.= ANY()
Postgres는 현재 GIN- 인덱싱 가능한 표현을 도출 할만큼 똑똑하지 않습니다. 우선, constant = ANY (array_expression)
이다 완전히 동일하지 에 array_expression @> ARRAY[constant]
. NULL 요소 가 관련된 경우 배열 연산자는 오류를 반환 하지만 ANY
구문은 양쪽에서 NULL을 처리 할 수 있습니다. 그리고 데이터 유형 불일치에 대해 다른 결과가 있습니다.
관련 답변 :
옆으로
값이 없는 integer
배열 ( int4
, not int2
또는 int8
)을 사용 하는 동안 NULL
(예를 들어 암시하는 것처럼) intarray
전문적이고 빠른 연산자와 색인 지원을 제공 하는 추가 모듈을 고려하십시오 . 보다:
UNIQUE
대답하지 않은 질문 의 제약에 관해서는 : 그것은 전체 배열 값 에 대해 btree 인덱스로 구현되었으며 (예상 한 것처럼) 요소 검색에 전혀 도움이되지 않습니다 . 세부:
jsonb
을 사용하고 인덱스를 사용할 수 있습니까? postgresql.org/docs/9.5/static/functions-json.html 및 postgresql.org/docs/9.5/static/datatype-json.html#JSON-INDEXING