[PostgreSQL] ์ธ๋ฑ์ค: Gist
Gist๋ PostgreSQL์ ์ฃผ์ ์ธ๋ฑ์ค ํ์ ์ค ํ๋๋ค.
์ด๊ฑด ๊ธฐ๋ณธ primitive ํ์ ์์คํ ์ ์ธ๋ฑ์ค๋ก๋ ์ ์ฐ์ด์ง ์๊ณ , ์ถ๊ฐ ํ์ฅ ํ๋ฌ๊ทธ์ธ์์ ์ผ๋ถ ํน์ํ ํํ์ ์ฟผ๋ฆฌ์ ๋ํด์ ์ง์์ด ๋๋ ํธ์ด๋ค. ํนํ ๊ณต๊ฐ ์ขํ์์์ ๊ฑฐ๋ฆฌ๋ ์ธ์ ์ฑ ๊ฒ์ฌ ๋ฑ์ ์์ฉ๋๋ค.
Gist๊ฐ ์ฌ์ฉ๋๋ ๋ํ์ ์ธ ํ์ฅ์ผ๋ก๋ PostGIS๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ํ์
์ค์์ Gist๊ฐ ์ง์๋๋ ๊ฒ์ผ๋ก๋ Range, Point ์ ๋๊ฐ ์๋ค.
๊ธฐ๋ณธ ์๋ฆฌ
Gist๋ Generalized Search Tree์ ์ถ์ฝ์ด๋ค.
๋ด๋ถ ๊ตฌํ์์ผ๋ก๋ ์ผ๋ฐํ๋ B-Tree์ง๋ง R-Tree์ ๊ฐ๋
์ ๊ฐ๊น๋ค.
https://postgrespro.com/blog/pgsql/4175817
์กฐ๊ธ ํท๊ฐ๋ฆด ์ ์๋๋ฐ, Gist๋ BTree์ ๋ค๋ฅด๊ฒ ๊ธฐ๋ณธ ํ์ ๋ค์ ๋ํ operator ๊ตฌํ์ฒด๊ฐ ์๋ค. PostgreSQL์ ์ธํฐํ์ด์ค๋ง์ ์ ๊ณตํ๊ณ ์ค์ ํ์ ๋ณ ๋์์ด๋ ์๋ฏธ๋ก ์ ๊ฐ ์๋ํํฐ ํ๋ฌ๊ทธ์ธ์ operator class๊ฐ ๊ตฌํํ๋ค.
์๋ฌดํผ ๊ธฐ๋ณธ ์๋ฆฌ๋ ์ด๊ฒ๋ Tree์ด๊ธด ํ๊ณ , ๋ฌผ๋ฆฌ ๊ตฌํ์์ผ๋ก B-Tree์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
๋ค๋ง ๊ฐ๋ค๋ผ๋ฆฌ์ ์ ์ฌ๋๋ฅผ ์ง์ ์ปค์คํ
ํ ์ ์๋ค๋ ๊ฒ์ด ๋ค๋ฅผ ๋ฟ์ด๋ค. ๋ค์ ๋งํด์, "์์ธ"์ด๋ผ๋ ๊ฐ๊ณผ "์ธ์ฒ"์ด๋ผ๋ ๊ฐ์ด "๋์ฟ"๋ณด๋ค ๊ฐ๊น์ด์ง๋ฅผ ํ๋ฌ๊ทธ์ธ ๊ตฌํ์ ์
์ฅ์์ ์ง์ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ B-Tree์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๊ฐ๋ผ๋ฆฌ "๊ฒน์น ์ ์๋ค."๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ํธ๋ฆฌ ํ์์ ๋ค์ด๊ฐ ๋๋ ๊ฒฐ์ ์ ์ผ๋ก ๋์ํ์ง ์๋๋ค. BTree๋ ์๋ธํธ๋ฆฌ๋ฅผ ํ๋ ๋ฑ ํ๋์ฉ ์ ํํด์ ๋ค์ด๊ฐ์ง๋ง, Gist๋ ์ฌ๋ฌ๊ฐ์ ์๋ธํธ๋ฆฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ ์ ์๋ค.
Gist์ ์ด์ ๊ณผ ํ๊ณ
Gist๋ ํน์ ์ ๊ตฌ์กฐ ํ์ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์ด ์กด์ฌํ๋ค. ํ์ ๊ณผ์ ์์ subtree๋ฅผ ๋๋ฌด ๋ง์ด ํ๊ณ ๋ค์ด๊ฐ๋ฉด fanout์ด ํญ์ฆํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ํ์ ์ค์ ๊ด๊ณ์๋ subtree๋ฅผ ๋ง์ด ๋ฒ๋ฆด ์ ์๋์ง(pruning)๊ฐ ์ค์ ์๋๋ฅผ ์ข์ฐํ๋๋ฐ, ์ผ๋ฐ์ ์ธ ๊ณต๊ฐ ์ขํ ๋ฐ์ดํฐ๋ค์ ์ด๋ฌํ ๋ฐ์ดํฐ ํจํด์ ์ ๋ง๋๋ค. "์์ธ"๊ณผ "๋ถ์ฐ"์ฒ๋ผ ๊ณต๊ฐ์ด ๊ฝค ๋ช
ํํ๊ฒ ๋ถ๋ฆฌ๋๊ณ , ๋ง ์์ฒญ๋๊ฒ ๊ฒน์น ์ผ๋ ์ ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทผ๋ฐ ์ด๊ฒ ์ฐจ์ ์๊ฐ ๋ฎ์ ๋ฐ์ดํฐ์๋ ํจ์จ์ ์ผ๋ก ์ ๋์ํ์ง๋ง, ์ฐจ์ ์๊ฐ ๋์์ง๋ ๊ฒฝ์ฐ์๋ ์ ํฉํ์ง ์๋ค.
ํนํ "๋ฒกํฐ" ์ฒ๋ผ ์ฐจ์์๊ฐ ์์ฒ ๋จ์๋ก ๊น์ด์ง๊ณ ๊ฐ๋ณ ๊ฐ๊ณผ์ ๊ฒน์นจ ์ ๋๊ฐ ์ฌ๋ฐฉํ๋ฐฉ์ผ๋ก ํผ์ง๋ ๊ฒฝ์ฐ์๋ subtree pruning์ด ๋งค์ฐ ๋๋ฌผ๊ฒ ์ผ์ด๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ง๋ค.
๊ทธ๋์ pgvector ๊ฐ์ ๊ฒฝ์ฐ์๋ Gist๋ฅผ ์ฐ์ง ์๊ณ HNSW ๊ฐ์ ์ปค์คํ
๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
Gist์ ์ฌ์ฉ๋ฒ
์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ๊ฒ ์์ฒด๋ ๊ทธ๋ค์ง ๋ณต์กํ๊ฑฐ๋ ์ด๋ ค์ธ ๊ฒ์ ์๋ค. gist๊ฐ ์ง์๋๋ ํ์ ์ ์ปฌ๋ผ์ gist ์ต์ ๋ง ๋๊ฒจ์ ๋ง๋ค๋ฉด ๋๋ค.
CREATE INDEX ์ธ๋ฑ์ค๋ช
ON ํ
์ด๋ธ๋ช
USING gist (์ปฌ๋ผ);
Gist๊ฐ ์ง์๋๋ ํ์
์ค์ ๊ฐ์ฅ ํ
์คํธ๊ฐ ๊ฐ๋จํ ๊ฒ์ Range ํ์
์ด๋ค. ๋ณ๋ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํ๋ค.
https://blog.naver.com/sssang97/224134278317
์๋ฌดํผ Gist ์ธ๋ฑ์ฑ์ ํ์ฐ๊ธฐ ์ํด์๋ ์ ์ ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ค.
์ฃผ๋ก ์ฌ์ฉ๋๋ ์ฐ์ฐ ํจํด์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฒน์นจ(overlap)
- ํฌํจ(contain)
- ๊ฑฐ๋ฆฌ(distance)
overlap ์ฐ์ฐ์๋ก๋ &&๊ฐ ๊ฐ์ฅ ๋ํ์ ์ธ๋ฐ, ์ด๊ฑด 2๊ฐ์ ๊ฐ์ด ๊ฒน์น๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
Range์์๋ 2๊ฐ์ ๋ฒ์๊ฐ ๊ฒน์น๋ ๋ถ๋ถ์ด ์๋์ง๋ฅผ ์ฒดํฌํ๊ณ , PostGIS์์๋ ๊ณต๊ฐ๋ผ๋ฆฌ ๊ฒน์น๋์ง๋ฅผ ๊ฒ์ฌํ๋ค.

@> ์ฐ์ฐ์๋ ํฌํจ๊ด๊ณ๋ฅผ ์ ์ํ๋ค. A @> B๋ฉด A๊ฐ B๋ฅผ ํฌํจํ๋ค๋ ๊ฒ์ด๋ค.

<-> ์ฐ์ฐ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ํ๋ค. ์ด๊ฑด ์๋ณ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํํ๋ค. ํนํ ์ ๋ ฌ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฉ์ดํ๋ค.

์ฐธ์กฐ
https://www.postgresql.org/docs/current/gist.html
https://postgrespro.com/blog/pgsql/4175817