(1) GiST
복합적인 지리학적(geometric) 데이터를 조회하는데 매우 유용한 인덱스이다.
Full Text Search 에서도 사용한다.
인덱싱 과정은 아래 그림과 같은 방식이다.
분포 양을 내부적인 로직으로 점점 나눈다.
그래프로 한 번 알아보자.
CREATE TABLE points(p point);
INSERT INTO points(p) VALUES
(POINT '(1,1)'), (POINT '(3,2)'), (POINT '(6,3)'),
(POINT '(5,5)'), (POINT '(7,8)'), (POINT '(8,6)');
CREATE INDEX ON points USING GIST(p);
앞서 배운 Geometric Type을 사용해서 일부 점을 INSERT 했다.
그리고 점에 대해서 GiST 인덱스를 생성한다.
내부 로직으로 점들의 범위를 위와 같이 나눈다.
SET enable_seqscan = off;
EXPLAIN(costs off) SELECT * FROM points WHERE p <@ box '(2,1),(7,4)';
Result
QUERY PLAN
----------------------------------------------
Index Only Scan using points_p_idx on points
Index Cond: (p <@ '(7,4),(2,1)'::box)
(2 rows)
정상적으로 인덱스 스캔을 확인할 수 있다.
(2, 1) , (7, 4) 범위를 찾아보면 위 사진과 같이 값을 찾아 나간다.
SELECT * FROM points WHERE p <@ box '(2,1),(7,4)';
Result
p
-------
(3,2)
(6,3)
(2 rows)
(2) SP-GiST
GiST를 개선하고 분류할 공간을 또 공간 단위로 나누어 관리하는 개념
SP-GiST에는 여러가지 방식이 존재하지만, 많이 사용한다는 Quad-Tree(사진 트리) 방식에 대해서 설명하겠다.
아래 그림과 같이 내부 로직에 의해 한 점을 기준으로 계속해서 4분할 해나가는 방식이다.
그래프로 알아보자.
위 그림처럼 인덱싱을 진행하며
수학시간에 배운 그래프에서 사분면을 통해서 각 레벨에 최대 4개 노드를 가지며 인덱싱을 한다.
REFERENCES
PostgreSQL : Documentation: 13: PostgreSQL 13.7 Documentation
postgrespro.com
'DB > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] PostgreSQL의 유니크 인덱스에 대해서 알아보자. (Unique Index) (0) | 2022.06.30 |
---|---|
[PostgreSQL] PostgreSQL의 멀티 칼럼 인덱스에 대해서 알아보자. (Multicolumn Indexes) (0) | 2022.06.30 |
[PostgreSQL] PostgreSQL의 Geometric Type에 대해서 알아보자. (0) | 2022.06.19 |
[PostgreSQL] PostgreSQL의 B-tree, Hash Index에 대해서 알아보자. (0) | 2022.06.19 |
[PostgreSQL] PostgreSQL의 쿼리 플랜에 대해서 알아보자. (Query Plan) (0) | 2022.06.19 |