itsource

JSON의 PostgreSQL 인덱스

mycopycode 2023. 2. 10. 21:53
반응형

JSON의 PostgreSQL 인덱스

Postgres 9.4를 사용하여 json column에 인덱스를 생성하여 컬럼 내의 특정 키를 검색할 때 사용합니다.

예를 들어 json 열이 'animals'인 'farm' 테이블이 있습니다.

동물 열에는 일반 형식의 json 개체가 있습니다.

'{"cow": 2, "chicken": 11, "horse": 3}'

여러 인덱스(별도)를 사용해 보았습니다.

  1. create INDEX animal_index ON farm ((animal ->> 'cow'));
  2. create INDEX animal_index ON farm using gin ((animal ->> 'cow'));
  3. create INDEX animal_index ON farm using gist ((animal ->> 'cow'));

다음과 같은 쿼리를 실행하고 싶다.

SELECT * FROM farm WHERE (animal ->> 'cow') > 3;

그리고 그 쿼리에 인덱스를 사용하도록 합니다.

이 쿼리를 실행할 때:

SELECT * FROM farm WHERE (animal ->> 'cow') is null;

그러면 (1) 지수는 작동하지만, 불평등을 위한 어떤 지표도 얻을 수 없습니다.

그런 지표가 가능합니까?

팜 테이블에는 5,000마리 이하의 팜밖에 포함되어 있지 않지만, 일부 팜에는 100마리 이상의 동물이 포함되어 있기 때문에 쿼리에 시간이 너무 오래 걸립니다.이러한 인덱스는 이 쿼리를 고속화하기 위해 생각할 수 있는 유일한 방법입니다만, 다른 옵션이 있을지도 모릅니다.

다른 2개의 인덱스는 단순히 오퍼레이터가 반환하기 때문에 기능하지 않습니다만,jsonb진 오퍼레이터 클래스를 염두에 두고 있습니다.언급하고 있는 것은, 다음과 같습니다.json그러나 실제로는 고급 인덱싱 기능이 필요합니다.

최상의 인덱싱 전략을 수립하려면 어떤 쿼리를 다룰지 보다 자세히 정의해야 합니다.당신은 소에만 관심이 있나요?아니면 모든 동물/모든 태그?어떤 오퍼레이터가 가능합니까?JSON 문서에는 동물 이외의 키도 포함되어 있습니까?저걸 어떻게 해야 하죠?소(또는 기타)가 JSON 문서에 나타나지 않는 행을 인덱스에 포함하시겠습니까?

전제 조건:

  • 우리는 보금자리 1단계에 있는 소에만 관심이 있다.
  • 값은 항상 유효합니다.integer.
  • 우리는 소가 없는 줄타기에는 관심이 없다.

이미 가지고 계신 것처럼 기능적인 btree 인덱스를 제안합니다만, 그 값을 에 부여해 주세요.integer이 비교가 평가되는 것을 원하지 않으실 겁니다.text(여기서 '2'는 '111'보다 큼).

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int));  -- !

인덱스 식 구문을 모호하지 않게 하려면 캐스트 속기에 추가 괄호 세트가 필요합니다.

Postgres가 인덱스를 적용할 수 있음을 인식하려면 쿼리에서 동일한 식을 사용합니다.

SELECT * FROM farm WHERE (animal ->> 'cow')::int > 3;

보다 일반적인 정보가 필요한 경우jsonb인덱스, 고려사항:

알려진 정적인 수의 사소한 동물에 대해서는 다음과 같은 부분 인덱스를 제안합니다.

CREATE INDEX animal_index ON farm (((animal ->> 'cow')::int))
WHERE (animal ->> 'cow') IS NOT NULL;

CREATE INDEX animal_index ON farm (((animal ->> 'chicken')::int))
WHERE (animal ->> 'chicken') IS NOT NULL;

기타.

질의에 인덱스 조건을 추가해야 할 수 있습니다.

SELECT * FROM farm
WHERE (animal ->> 'cow')::int > 3
AND   (animal ->> 'cow') IS NOT NULL; 

불필요한 것처럼 보일 수도 있지만, 필요할 수도 있습니다.스트로 합니다.ANALYZE!

언급URL : https://stackoverflow.com/questions/36075918/postgresql-index-on-json

반응형