[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 ์ธ๋ฑ์‹ฑ์„ ํƒœ์šฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ ์ ˆํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค.
์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฒน์นจ(overlap)
  2. ํฌํ•จ(contain)
  3. ๊ฑฐ๋ฆฌ(distance)

overlap ์—ฐ์‚ฐ์ž๋กœ๋Š” &&๊ฐ€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ๋ฐ, ์ด๊ฑด 2๊ฐœ์˜ ๊ฐ’์ด ๊ฒน์นœ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
Range์—์„œ๋Š” 2๊ฐœ์˜ ๋ฒ”์œ„๊ฐ€ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๊ณ , PostGIS์—์„œ๋Š” ๊ณต๊ฐ„๋ผ๋ฆฌ ๊ฒน์น˜๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

@> ์—ฐ์‚ฐ์ž๋Š” ํฌํ•จ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ๋‹ค. A @> B๋ฉด A๊ฐ€ B๋ฅผ ํฌํ•จํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

<-> ์—ฐ์‚ฐ์ž๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด๊ฑด ์–‘๋ณ€ ๊ฐ’์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŠนํžˆ ์ •๋ ฌ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.



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