PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

์ „๊ตญ ์˜์—…์ ์˜ ์ˆ˜์ฒœ๋ช…์˜ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ธฐ๋ก์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ CRM ์‹œ์Šคํ…œ ๋งค์ผ ์ˆ˜๋งŒ ๊ฑด์˜ ์—ฐ๋ฝ โ€” ์ž ์žฌ ๊ณ ๊ฐ ๋˜๋Š” ๊ธฐ์กด ๊ณ ๊ฐ๊ณผ์˜ ์˜์‚ฌ์†Œํ†ต ์‚ฌ์‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๊ณ ๊ฐ์„ ์ฐพ์•„์•ผ ํ•˜๋ฉฐ, ๊ฐ€๊ธ‰์ ์ด๋ฉด ๋งค์šฐ ๋นจ๋ฆฌ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ด๋ฆ„์œผ๋กœ ๊ฐ€์žฅ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘ ํ•˜๋‚˜์ธ ์šฐ๋ฆฌ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ "๋ฌด๊ฑฐ์šด" ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. VLSI ๊ธฐ์—… ๊ณ„์ •, '์ƒ๋‹จ'์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์œผ๋กœ "๋น ๋ฅธ" ๊ฒ€์ƒ‰ ์š”์ฒญ ์กฐ์ง ์นด๋“œ์šฉ.

๊ฒŒ๋‹ค๊ฐ€ ์ถ”๊ฐ€ ์กฐ์‚ฌ๋ฅผ ํ†ตํ•ด ํฅ๋ฏธ๋กœ์šด ์‚ฌ๋ก€๊ฐ€ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ตœ์ ํ™” ํ›„ ์„ฑ๋Šฅ ์ €ํ•˜ ์—ฌ๋Ÿฌ ํŒ€์ด ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐœ์„ ํ•˜์—ฌ ์š”์ฒญํ–ˆ์œผ๋ฉฐ, ๊ฐ ํŒ€์€ ์ตœ์„ ์˜ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ ๋งŒ ํ–‰๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

0: ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ด์—ˆ๋‚˜์š”?

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ[KDPV ๋”ฐ๋ผ์„œ]

์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฆ„์œผ๋กœ "๋น ๋ฅธ" ๊ฒ€์ƒ‰์„ ๋งํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•˜์œ„ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ "์ •์งํ•œ" ๊ฒ€์ƒ‰์€ ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ... LIKE '%ั€ะพะทะฐ%' - ๊ฒฐ๊ณผ์—๋Š” ๋‹ค์Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ 'ะ ะพะทะฐะปะธั' ะธ 'ะœะฐะณะฐะทะธะฝ ะ ะพะทะฐ'ํ•˜์ง€๋งŒ 'ะ“ั€ะพะทะฐ' ์‹ฌ์ง€์–ด 'ะ”ะพะผ ะ”ะตะดะฐ ะœะพั€ะพะทะฐ'.

์‚ฌ์šฉ์ž๋Š” ์ผ์ƒ์ ์ธ ์ˆ˜์ค€์—์„œ ๊ท€ํ•˜๊ฐ€ ๊ทธ์—๊ฒŒ ๋‹ค์Œ์„ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์–ด ์‹œ์ž‘์œผ๋กœ ๊ฒ€์ƒ‰ ์ œ๋ชฉ์— ๋” ๊ด€๋ จ์„ฑ์ด ๋†’์•„์ง€๋„๋ก ํ•˜์„ธ์š”. ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๊ฑฐ์˜ ์ฆ‰์‹œ - ํ–‰๊ฐ„ ์ž…๋ ฅ์šฉ.

1: ์ž‘์—…์„ ์ œํ•œํ•˜๋‹ค

๊ทธ๋ฆฌ๊ณ  ๋”์šฑ์ด ์‚ฌ๋žŒ์€ ํŠน๋ณ„ํžˆ ์ž…๋ ฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค 'ั€ะพะท ะผะฐะณะฐะท', ๋”ฐ๋ผ์„œ ๊ฐ ๋‹จ์–ด๋ฅผ ์ ‘๋‘์–ด๋กœ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ์š”, ์ด์ „ ๋‹จ์–ด๋ฅผ ์˜๋„์ ์œผ๋กœ "๊ณผ์†Œ ์ง€์ •"ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ง€๋ง‰ ๋‹จ์–ด์— ๋Œ€ํ•œ ๋น ๋ฅธ ํžŒํŠธ์— ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์—”์ง„์ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”.

์ผ๋ฐ˜์ ์œผ๋กœ, ๋ฐ”๋ฅด๊ฒŒ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ณต์‹ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์†”๋ฃจ์…˜์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์ž…๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์‹ ์ค‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋ถ„์„ ๊ฒฐ๊ณผ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ƒ ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋–ค ์ผ์„ ํ•˜๋‚˜์š”?

1.0: ์™ธ๋ถ€ ๊ฒ€์ƒ‰ ์—”์ง„

์•„, ๊ฒ€์ƒ‰์ด ์–ด๋ ต๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค. ๋ฐ๋ธŒ์˜ต์Šค์— ๋งก๊ธฐ์ž! ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์™ธ๋ถ€์— ๊ฒ€์ƒ‰ ์—”์ง„(Sphinx, ElasticSearch ๋“ฑ)์„ ๋ฐฐํฌํ•˜๋„๋ก ํ•˜์„ธ์š”.

๋™๊ธฐํ™” ๋ฐ ๋ณ€๊ฒฝ ์†๋„ ์ธก๋ฉด์—์„œ ๋…ธ๋™ ์ง‘์•ฝ์ ์ด์ง€๋งŒ ์ž‘์—… ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๊ณ„์ • ๋ฐ์ดํ„ฐ์˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ๋งŒ ๊ฐ ๊ณ ๊ฐ์— ๋Œ€ํ•ด ๊ฒ€์ƒ‰์ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ๋ณ€๋™์„ฑ์€ ์ƒ๋‹นํžˆ ๋†’์Šต๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๊ฐ€ ์ด์ œ ์นด๋“œ๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด 'ะœะฐะณะฐะทะธะฝ ะ ะพะทะฐ', 5-10์ดˆ ํ›„์— ๊ทธ๋Š” ์ž์‹ ์˜ ์ด๋ฉ”์ผ์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ๊ณ  ๊ทธ๊ฒƒ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ - ํ•˜์ž "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง์ ‘" ๊ฒ€์ƒ‰. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ PostgreSQL์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹จ์ง€ ํ•˜๋‚˜์˜ ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ ์ด์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1.1: "์ •์งํ•œ" ํ•˜์œ„ ๋ฌธ์ž์—ด

์šฐ๋ฆฌ๋Š” "ํ•˜์œ„ ๋ฌธ์ž์—ด"์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๊ณ ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋ฌธ์ž์—ด(์‹ฌ์ง€์–ด ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ๋„!)์„ ์‚ฌ์šฉํ•œ ์ƒ‰์ธ ๊ฒ€์ƒ‰์—๋Š” ํƒ์›”ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ pg_trgm! ๊ทธ๋ž˜์•ผ๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

CREATE TABLE firms(
  id
    serial
      PRIMARY KEY
, name
    text
);

์šฐ๋ฆฌ๋Š” ์‹ค์ œ ์กฐ์ง์— ๋Œ€ํ•œ 7.8๋งŒ ๊ฐœ์˜ ๊ธฐ๋ก์„ ์—…๋กœ๋“œํ•˜๊ณ  ์ƒ‰์ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CREATE EXTENSION pg_trgm;
CREATE INDEX ON firms USING gin(lower(name) gin_trgm_ops);

ํ–‰๊ฐ„ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ์ฒ˜์Œ 10๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SELECT
  *
FROM
  firms
WHERE
  lower(name) ~ ('(^|s)' || 'ั€ะพะทะฐ')
ORDER BY
  lower(name) ~ ('^' || 'ั€ะพะทะฐ') DESC -- ัะฝะฐั‡ะฐะปะฐ "ะฝะฐั‡ะธะฝะฐัŽั‰ะธะตัั ะฝะฐ"
, lower(name) -- ะพัั‚ะฐะปัŒะฝะพะต ะฟะพ ะฐะปั„ะฐะฒะธั‚ัƒ
LIMIT 10;

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
[explain.tensor.ru ์ฐธ์กฐ]

์Œ, ๊ทธ๋Ÿฐ... 26ms, 31MB 1.7๊ฐœ์˜ ๊ฒ€์ƒ‰๋œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ ๋ฐ 10K ์ด์ƒ์˜ ํ•„ํ„ฐ๋ง๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ„์ ‘๋น„๊ฐ€ ๋„ˆ๋ฌด ๋†’๋„ค์š”. ์ข€ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ์š”?

1.2: ํ…์ŠคํŠธ๋กœ ๊ฒ€์ƒ‰ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? FTS์ž…๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ PostgreSQL์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ์—”์ง„ (์ „์ฒด ํ…์ŠคํŠธ ๊ฒ€์ƒ‰), ์ ‘๋‘์–ด ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํฌํ•จ. ํ›Œ๋ฅญํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค! ํ•ด๋ณด์ž:

CREATE INDEX ON firms USING gin(to_tsvector('simple'::regconfig, lower(name)));

SELECT
  *
FROM
  firms
WHERE
  to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ั€ะพะทะฐ:*')
ORDER BY
  lower(name) ~ ('^' || 'ั€ะพะทะฐ') DESC
, lower(name)
LIMIT 10;

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
[explain.tensor.ru ์ฐธ์กฐ]

์—ฌ๊ธฐ์„œ๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰์˜ ๋ณ‘๋ ฌํ™”๊ฐ€ ์•ฝ๊ฐ„ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉฐ, ์‹œ๊ฐ„์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‹จ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. 11ms. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ „์ฒด์ ์œผ๋กœ 1.5๋ฐฐ ๋” ์ ์€ ์–‘์„ ์ฝ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 20MB. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ๋Š” ์ฝ์„ ๋ณผ๋ฅจ์ด ํด์ˆ˜๋ก ์บ์‹œ ๋ˆ„๋ฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๊ณ  ๋””์Šคํฌ์—์„œ ์ฝ์€ ๋ชจ๋“  ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๊ฐ€ ์š”์ฒญ์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ "์ œ๋™"์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์„์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค.

1.3: ์•„์ง๋„ ์ข‹์•„์š”?

์ด์ „ ์š”์ฒญ์€ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์ข‹์ง€๋งŒ ํ•˜๋ฃจ์— ์ˆ˜์‹ญ๋งŒ ๋ฒˆ ๋‹น๊ฒจ์•ผ๋งŒ ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2TB ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๊ฒฝ์šฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ, ์šด์ด ์ข‹์ง€ ์•Š๋‹ค๋ฉด ๋””์Šคํฌ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ข€ ๋” ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ž ์ฒซ ๋ฒˆ์งธ "...๋กœ ์‹œ์ž‘ํ•˜๋Š”". ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ๊ฐ€์žฅ ์ˆœ์ˆ˜ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค ์ ‘๋‘์‚ฌ ๊ฒ€์ƒ‰ ๋ฅผ ํ†ตํ•ด text_pattern_ops! ๊ทธ๋ฆฌ๊ณ  ์ฐพ๊ณ  ์žˆ๋Š” ์ตœ๋Œ€ 10๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ "์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€" ๊ฒฝ์šฐ์—๋งŒ FTS ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ ์ฝ๊ธฐ๋ฅผ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CREATE INDEX ON firms(lower(name) text_pattern_ops);

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('ั€ะพะทะฐ' || '%')
LIMIT 10;

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
[explain.tensor.ru ์ฐธ์กฐ]

์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ - ์ „์ฒด 0.05ms, 100KB ์กฐ๊ธˆ ๋„˜์Œ ์ฝ๋‹ค! ์šฐ๋ฆฌ๋งŒ ์žŠ์–ด๋ฒ„๋ ธ์–ด ์ด๋ฆ„์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๋‹ค์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ๊ณผ์—์„œ ๊ธธ์„ ์žƒ์ง€ ์•Š๋„๋ก:

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('ั€ะพะทะฐ' || '%')
ORDER BY
  lower(name)
LIMIT 10;

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
[explain.tensor.ru ์ฐธ์กฐ]

์•„, ๋ญ”๊ฐ€ ๋” ์ด์ƒ ๊ทธ๋‹ค์ง€ ์•„๋ฆ„๋‹ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ‰์ธ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ •๋ ฌ์ด ์ง€๋‚˜๊ฐ‘๋‹ˆ๋‹ค... ๋ฌผ๋ก  ์ด๋ฏธ ์ด์ „ ์˜ต์…˜๋ณด๋‹ค ๋ช‡ ๋ฐฐ ๋” ํšจ๊ณผ์ ์ด์ง€๋งŒ...

1.4: "ํŒŒ์ผ๋กœ ๋งˆ๋ฌด๋ฆฌ"

ํ•˜์ง€๋งŒ ๋ฒ”์œ„๋ณ„๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ •๋ ฌ์„ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ‰์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ BํŠธ๋ฆฌ!

CREATE INDEX ON firms(lower(name));

์ด์— ๋Œ€ํ•œ ์š”์ฒญ๋งŒ "์ˆ˜๋™์œผ๋กœ ์ˆ˜์ง‘"๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SELECT
  *
FROM
  firms
WHERE
  lower(name) >= 'ั€ะพะทะฐ' AND
  lower(name) <= ('ั€ะพะทะฐ' || chr(65535)) -- ะดะปั UTF8, ะดะปั ะพะดะฝะพะฑะฐะนั‚ะพะฒั‹ั… - chr(255)
ORDER BY
   lower(name)
LIMIT 10;

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
[explain.tensor.ru ์ฐธ์กฐ]

ํ›Œ๋ฅญํ•จ - ์ •๋ ฌ์ด ์ž‘๋™ํ•˜๊ณ  ์ž์› ์†Œ๋น„๊ฐ€ "๋ฏธ์‹œ์ "์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. "์ˆœ์ˆ˜ํ•œ" FTS๋ณด๋‹ค ์ˆ˜์ฒœ ๋ฐฐ ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.! ๋‚จ์€ ๊ฒƒ์€ ์ด๋ฅผ ํ•˜๋‚˜์˜ ์š”์ฒญ์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(
  SELECT
    *
  FROM
    firms
  WHERE
    lower(name) >= 'ั€ะพะทะฐ' AND
    lower(name) <= ('ั€ะพะทะฐ' || chr(65535)) -- ะดะปั UTF8, ะดะปั ะพะดะฝะพะฑะฐะนั‚ะพะฒั‹ั… ะบะพะดะธั€ะพะฒะพะบ - chr(255)
  ORDER BY
     lower(name)
  LIMIT 10
)
UNION ALL
(
  SELECT
    *
  FROM
    firms
  WHERE
    to_tsvector('simple'::regconfig, lower(name)) @@ to_tsquery('simple', 'ั€ะพะทะฐ:*') AND
    lower(name) NOT LIKE ('ั€ะพะทะฐ' || '%') -- "ะฝะฐั‡ะธะฝะฐัŽั‰ะธะตัั ะฝะฐ" ะผั‹ ัƒะถะต ะฝะฐัˆะปะธ ะฒั‹ัˆะต
  ORDER BY
    lower(name) ~ ('^' || 'ั€ะพะทะฐ') DESC -- ะธัะฟะพะปัŒะทัƒะตะผ ั‚ัƒ ะถะต ัะพั€ั‚ะธั€ะพะฒะบัƒ, ั‡ั‚ะพะฑั‹ ะะ• ะฟะพะนั‚ะธ ะฟะพ btree-ะธะฝะดะตะบััƒ
  , lower(name)
  LIMIT 10
)
LIMIT 10;

๋‘ ๋ฒˆ์งธ ํ•˜์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด ์˜ˆ์ƒ๋ณด๋‹ค ์ ๊ฒŒ ๋ฐ˜ํ™˜๋œ ๊ฒฝ์šฐ์—๋งŒ ๋งˆ์ง€๋ง‰ LIMIT ์ค„ ์ˆ˜. ์ €๋Š” ์ด ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ „์— ์ผ์–ด.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ…Œ์ด๋ธ”์—๋Š” btree์™€ gin์ด ๋ชจ๋‘ ์žˆ์ง€๋งŒ ํ†ต๊ณ„์ ์œผ๋กœ๋Š” ์š”์ฒญ์˜ 10% ๋ฏธ๋งŒ์ด ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก ์‹คํ–‰์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค.. ์ฆ‰, ์ž‘์—…์— ๋Œ€ํ•ด ์‚ฌ์ „์— ์•Œ๋ ค์ง„ ์ผ๋ฐ˜์ ์ธ ์ œํ•œ ์‚ฌํ•ญ์„ ํ†ตํ•ด ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค์˜ ์ด ์†Œ๋น„๋ฅผ ๊ฑฐ์˜ ์ฒœ ๋ฐฐ๋‚˜ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

1.5*: ํŒŒ์ผ ์—†์ด๋„ ๊ฐ€๋Šฅ

๋” ๋†’์€ LIKE ์ž˜๋ชป๋œ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐฉ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ USING ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์ •ํ•˜์—ฌ "์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ์— ์„ค์ •"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ •๋ฉ๋‹ˆ๋‹ค. ASC. ๋˜ํ•œ ์ ˆ์— ํŠน์ • ์ •๋ ฌ ์—ฐ์‚ฐ์ž์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. USING. ์ •๋ ฌ ์—ฐ์‚ฐ์ž๋Š” ์ผ๋ถ€ B-ํŠธ๋ฆฌ ์—ฐ์‚ฐ์ž ๊ณ„์—ด๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ํผ์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ASC ์ผ๋ฐ˜์ ์œผ๋กœ ๋™๋“ฑ USING < ะธ DESC ์ผ๋ฐ˜์ ์œผ๋กœ ๋™๋“ฑ USING >.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ "๋œ"์€ ~<~:

SELECT
  *
FROM
  firms
WHERE
  lower(name) LIKE ('ั€ะพะทะฐ' || '%')
ORDER BY
  lower(name) USING ~<~
LIMIT 10;

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ
[explain.tensor.ru ์ฐธ์กฐ]

2: ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”๊ฐ€

์ด์ œ ์šฐ๋ฆฌ๋Š” XNUMX๊ฐœ์›” ๋˜๋Š” XNUMX๋…„ ๋™์•ˆ "๋“์ด๊ธฐ" ์š”์ฒญ์„ ๋‚จ๊ฒจ๋‘๊ณ  ์ผ์ผ ์ด ๋ฉ”๋ชจ๋ฆฌ "ํŽŒํ•‘" ์ง€ํ‘œ์™€ ํ•จ๊ป˜ ๋‹ค์‹œ "์ƒ๋‹จ"์— ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.๋ฒ„ํผ ๊ณต์œ  ์ ์ค‘)์—์„œ 5.5TB -์ฆ‰, ์›๋ž˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋ฌผ๋ก  ๋น„์ฆˆ๋‹ˆ์Šค๋„ ์„ฑ์žฅํ–ˆ๊ณ  ์ž‘์—…๋Ÿ‰๋„ ๋Š˜์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ •๋„๋Š” ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ์—ฌ๊ธฐ์— ๋ญ”๊ฐ€ ์ˆ˜์ƒํ•œ ๊ฒƒ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2.1: ํŽ˜์ด์ง•์˜ ํƒ„์ƒ

์–ด๋Š ์‹œ์ ์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ํŒ€์€ ๋™์ผํ•˜์ง€๋งŒ ํ™•์žฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ์ฒจ์ž ๊ฒ€์ƒ‰์—์„œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ "์ ํ”„"ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ํƒ์ƒ‰์ด ์—†๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ง์น˜์ž!

( ... LIMIT <N> + 10)
UNION ALL
( ... LIMIT <N> + 10)
LIMIT 10 OFFSET <N>;

์ด์ œ ๊ฐœ๋ฐœ์ž๋Š” ์ŠคํŠธ๋ ˆ์Šค ์—†์ด "ํŽ˜์ด์ง€๋ณ„" ๋กœ๋”ฉ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์‹ค์ œ๋กœ๋Š” ์ดํ›„์˜ ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ ์  ๋” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. (์ด์ „ ์‹œ๊ฐ„์˜ ๋ชจ๋“  ๋‚ด์šฉ๊ณผ ํ•„์š”ํ•œ "๊ผฌ๋ฆฌ"๋ฅผ ์ถ”๊ฐ€ํ•จ) - ์ฆ‰, ์ด๋Š” ๋ช…ํ™•ํ•œ ๋ฐ˜ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์ €์žฅ๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ ๊ฒ€์ƒ‰์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2.2: ์ด๊ตญ์ ์ธ ๊ฒƒ์„ ์›ํ•ด์š”

์–ด๋Š ์‹œ์ ์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์ƒ˜ํ”Œ์„ ๋ฐ์ดํ„ฐ๋กœ ๋‹ค์–‘ํ™” ์ „์ฒด ์ด์ „ ์š”์ฒญ์ด CTE๋กœ ์ „์†ก๋œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ:

WITH q AS (
  ...
  LIMIT <N> + 10
)
SELECT
  *
, (SELECT ...) sub_query -- ะบะฐะบะพะน-ั‚ะพ ะทะฐะฟั€ะพั ะบ ัะฒัะทะฐะฝะฝะพะน ั‚ะฐะฑะปะธั†ะต
FROM
  q
LIMIT 10 OFFSET <N>;

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•˜์œ„ ์ฟผ๋ฆฌ๋Š” ๋ฐ˜ํ™˜๋œ 10๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ํ‰๊ฐ€๋˜๋ฏ€๋กœ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2.3: DISTINCT๋Š” ๋ฌด์˜๋ฏธํ•˜๊ณ  ๋ฌด์ž๋น„ํ•ฉ๋‹ˆ๋‹ค.

2์ฐจ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ๊ทธ๋Ÿฐ ์ง„ํ™” ๊ณผ์ • ์–ด๋”˜๊ฐ€์—์„œ ์žƒ์–ด๋ฒ„๋ฆฐ NOT LIKE ์กฐ๊ฑด. ์ด ์ดํ›„์—๋Š” ๋ถ„๋ช…ํ•˜๋‹ค. UNION ALL ๋Œ์•„์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค ์ผ๋ถ€ ํ•ญ๋ชฉ์ด ๋‘ ๋ฒˆ - ์ฒ˜์Œ์—๋Š” ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ๋ฐœ๊ฒฌ๋˜๊ณ , ๊ทธ ๋‹ค์Œ์—๋Š” ๋‹ค์‹œ - ์ด ์ค„์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ์–ด์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ๋ฐœ๊ฒฌ๋ฉ๋‹ˆ๋‹ค. ํ•œ๊ณ„ ๋‚ด์—์„œ ๋‘ ๋ฒˆ์งธ ํ•˜์œ„ ์ฟผ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ํ•˜์œ„ ์ฟผ๋ฆฌ์˜ ๋ ˆ์ฝ”๋“œ์™€ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ์›์ธ์„ ์ฐพ๋Š” ๋Œ€์‹  ๋ฌด์—‡์„ ํ•ฉ๋‹ˆ๊นŒ?.. ์งˆ๋ฌธ์—†์Šต๋‹ˆ๋‹ค!

  • ํฌ๊ธฐ๋ฅผ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ฆฌ๋‹ค ์›๋ณธ ์ƒ˜ํ”Œ
  • DISTINCT๋ฅผ ์ ์šฉํ•˜๋‹ค๊ฐ ์ค„์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋งŒ ์–ป์œผ๋ ค๋ฉด

WITH q AS (
  ( ... LIMIT <2 * N> + 10)
  UNION ALL
  ( ... LIMIT <2 * N> + 10)
  LIMIT <2 * N> + 10
)
SELECT DISTINCT
  *
, (SELECT ...) sub_query
FROM
  q
LIMIT 10 OFFSET <N>;

์ฆ‰, ๊ฒฐ๊ณผ๋Š” ๊ฒฐ๊ตญ ๋˜‘๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ CTE ํ•˜์œ„ ์ฟผ๋ฆฌ๋กœ "๋‚ ์•„๊ฐˆ" ํ™•๋ฅ ์ด ํ›จ์”ฌ ๋†’์•„์กŒ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์—†์–ด๋„ ํ™•์‹คํžˆ ๋” ์ฝ๊ธฐ ์‰ฌ์›Œ์š”.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ฐ€์žฅ ์Šฌํ”ˆ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ ํƒํ•˜๋ผ๊ณ  ํ•ด์„œ DISTINCT ํŠน์ • ๋ถ„์•ผ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๋ถ„์•ผ๋ฅผ ๋™์‹œ์— ๋Œ€์ƒ์œผ๋กœ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ํ•˜์œ„ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์ธ sub_query ํ•„๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์—ฌ๊ธฐ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์‹คํ–‰ํ•˜๋ ค๋ฉด DISTINCT, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด๋ฏธ ์‹คํ–‰๋˜์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 10๊ฐœ์˜ ํ•˜์œ„ ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋‘ <2 * N> + 10!

2.4: ๋ฌด์—‡๋ณด๋‹ค๋„ ํ˜‘๋ ฅ!

๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ๊ณ„์† ์‚ด์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๊ฐ ํ›„์† "ํŽ˜์ด์ง€"์ˆ˜์‹ ์ด ๋งŒ์„ฑ์ ์œผ๋กœ ๋Š๋ ค์ง€๋ฉด์„œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ค‘์š”ํ•œ N ๊ฐ’์œผ๋กœ "์กฐ์ •"ํ•  ์ถฉ๋ถ„ํ•œ ์ธ๋‚ด์‹ฌ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ถ€์„œ์˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ์™€์„œ ์ด๋ ‡๊ฒŒ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด์ง€๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ฐ˜๋ณต ๊ฒ€์ƒ‰์„ ์œ„ํ•ด - ์ฆ‰, ์ผ๋ถ€ ์ƒ˜ํ”Œ์—์„œ ์กฐ๊ฐ์„ ๊ฐ€์ ธ์™€ ์ถ”๊ฐ€ ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฆฐ ๋‹ค์Œ ๋‹ค์Œ ์กฐ๊ฐ(์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ N์„ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ฌ์„ฑ) ๋“ฑ์„ ํ™”๋ฉด์„ ์ฑ„์šธ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํฌํš๋œ ํ‘œ๋ณธ์—์„œ๋Š” N์€ ๊ฑฐ์˜ 17K ๊ฐ’์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค., ๋‹จ ํ•˜๋ฃจ ๋งŒ์— ์ด๋Ÿฌํ•œ ์š”์ฒญ ์ค‘ ์ตœ์†Œ 4K๊ฐ€ "์ฒด์ธ์„ ๋”ฐ๋ผ" ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๋งˆ์ง€๋ง‰์€ ๋Œ€๋‹ดํ•˜๊ฒŒ ์Šค์บ”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋‹น 1GB ๋ฉ”๋ชจ๋ฆฌ...

์ „์ฒด๋กœ

PostgreSQL ์•ˆํ‹ฐํŒจํ„ด: ์ด๋ฆ„๋ณ„ ๊ฒ€์ƒ‰์˜ ๋ฐ˜๋ณต์  ๊ฐœ์„  ๋˜๋Š” "์•ž๋’ค๋กœ ์ตœ์ ํ™”"์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€