> 데이터 베이스 > MySQL 튜토리얼 > GIN 인덱스를 사용하여 Postgres JSONB 배열 쿼리를 최적화하는 방법은 무엇입니까?

GIN 인덱스를 사용하여 Postgres JSONB 배열 쿼리를 최적화하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-06 13:25:40
원래의
604명이 탐색했습니다.

How to Optimize Postgres JSONB Array Queries with GIN Indexes?

Postgres에서 JSONB 배열과 함께 GIN 인덱스를 사용하는 방법

문제:
JSONB 배열을 쿼리할 때 events_gin_idx ON some_table USING을 사용하는 GIN 인덱스 Postgres 진(이벤트); 특정 배열 요소를 검색하는 쿼리는 최적화되지 않을 수 있습니다.

원인:
쿼리는 jsonb_array_elements(events) AS e를 사용하여 배열 요소를 JSON 배열 요소로 변환하고 있습니다. 인덱싱.

Postgres 12에 대한 적절한 인덱싱 또는 이후:
경로 표현식이 포함된 쿼리를 지원하는 GIN 인덱스를 생성하려면 jsonb_path_ops 연산자 클래스를 사용하세요.

CREATE INDEX locations_events_gin_idx ON locations USING gin (events jsonb_path_ops);
로그인 후 복사

Postgres 12 이상에 대한 쿼리 구문:
@?를 사용하세요. 조건과 일치하는 배열 요소를 테스트하는 연산자:

SELECT *
FROM locations
WHERE events @? '$[*] ? (@.event_slug == "test_1")
                      ? (@.end_time.datetime() < "2014-10-13".datetime()'
로그인 후 복사

이전 버전 Postgres의 쿼리 구문:
Postgres 12 이전 버전의 경우 @>를 사용할 수 있습니다. ; 부분 JSON 객체를 사용하는 연산자:

SELECT *
FROM locations
WHERE events @> '[{ "event_slug": "test_1"}]';
로그인 후 복사

구체화된 뷰를 사용한 고급 솔루션:
기본 인덱싱 솔루션의 성능이 충분하지 않은 경우 구체화된 뷰 생성을 고려하세요.

CREATE MATERIALIZED VIEW loc_event AS
SELECT l.location_id, e.event_slug, e.end_time  -- start_time not needed
FROM locations l, jsonb_populate_recordset(null::event_type, l.events) e;

CREATE INDEX loc_event_idx ON loc_event (event_slug, end_time, location_id);
로그인 후 복사

구체화된 보기 쿼리:

SELECT *
FROM loc_event
WHERE event_slug = 'test_1'
AND end_time >= '2014-10-30 14:04:06 -0400'::timestamptz;
로그인 후 복사

위 내용은 GIN 인덱스를 사용하여 Postgres JSONB 배열 쿼리를 최적화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿