[PostgreSQL] ๋ฏธ์‚ฌ์šฉ ์ธ๋ฑ์Šค(INDEX) ์ฐพ๊ธฐ ๋ฐ ์‚ญ์ œ, ์„ฑ๋Šฅํ–ฅ์ƒ

[PostgreSQL] ๋ฏธ์‚ฌ์šฉ ์ธ๋ฑ์Šค(INDEX) ์ฐพ๊ธฐ ๋ฐ ์‚ญ์ œ, ์„ฑ๋Šฅํ–ฅ์ƒ

1. ์ธ๋ฑ์Šค(INDEX) ์ƒ์„ธ ๊ฐœ๋… Postgresql ์ธ๋ฑ์Šค(INDEX)๊ฐœ๋… ๋ฐ ์ƒ์„ฑ, ์‚ญ์ œ, ๋ถ„์„, ์„ค๊ณ„ ๋ฐฉ๋ฒ• 2. ๋ฏธ์‚ฌ์šฉ ์ธ๋ฑ์Šค ๊ฐ„๋‹จํžˆ ๋งํ•ด, ์ธ๋ฑ์Šค๋Š” ์ง€์ • ์ปฌ๋Ÿผ์— ๋งคํ•‘๋œ ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค. ๋ณดํ†ต ํ”Œ๋žœ ํ™•์ธ์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฟผ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ค๋ž˜๋˜๊ณ  ๋ณ€๊ฒฝ์ด ์žฆ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ์ˆ˜๋ก ๋ฏธ์‚ฌ์šฉ ์ธ๋ฑ์Šค๋Š” ๋Š˜์–ด๋‚˜๊ณ , ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งค๋ฒˆ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ํž˜๋“  ์ผ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ•„์š” ์ธ๋ฑ์Šค๋Š” ๋””๋น„ ์„ฑ๋Šฅ์ €ํ•˜ ๋ฐ vacuum ์ฝ”์ŠคํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ์—, ์ตœ์ ํ™”๋œ ์ธ๋ฑ์Šค ์ƒ์„ฑ๋งŒํผ ์ตœ์ ํ™”๋œ ์ธ๋ฑ์Šค ์‚ญ์ œ๋„ ์ค‘์š”ํ•˜๋‹ค. ...

ERROR: text search configuration name \"english\" must be schema-qualified

ERROR: text search configuration name \"english\" must be schema-qualified

1. ๋ฐœ์ƒ ํ•ด๋‹น ์—๋Ÿฌ๋Š” Postgresql์—์„œ Full Text Search๋ฅผ ์œ„ํ•ด tsvector ์ปฌ๋Ÿผ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. -- ํŠน์ • ์ปฌ๋Ÿผ์„ ts_vector๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์—…๋ฐ์ดํŠธ UPDATE TABLE SET tsvec_words = to_tsvector('english',COLUMN); 2. ์›์ธ ํ•ด๋‹น ์ปฌ๋Ÿผ (ํ˜น์€ ๋‹ค๋ฅธ ์ปฌ๋Ÿผ) ์— ํ…Œ์ด๋ธ” row ์—…๋ฐ์ดํŠธ/์ธ์„œํŠธ ์‹œ ts_vector๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” trigger๊ฐ€ ๊ฑธ๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—…๋ฐ์ดํŠธ ๊ฐ„ ์ถฉ๋Œ์ด ์ƒ๊ฒจ ๋ฐœ์ƒํ•œ๋‹ค. 3. ํ•ด๊ฒฐ ํŠธ๋Ÿฌ๊ฑฐ๋ฅผ ์‚ญ์ œ ํ›„ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ํ›„์— ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์žฌ์„ค์ •ํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค. 3-1. ํŠธ๋ฆฌ๊ฑฐ ์‚ญ์ œ drop trigger TABLE_TRGGER on TABLE; 3-2. ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ CREATE TRIGGER TABLE_TRIGGER BEFORE INSERT OR UPDATE ON TABLE FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(tsvec_words, 'english',COLUMN); ...

[PostgreSQL] ๋ฌธ์ž์—ด๋‚ด ์ค‘๋ณต ๊ณต๋ฐฑ, ๋‹จ์–ด ์ œ๊ฑฐ

[PostgreSQL] ๋ฌธ์ž์—ด๋‚ด ์ค‘๋ณต ๊ณต๋ฐฑ, ๋‹จ์–ด ์ œ๊ฑฐ

1. ์ค‘๋ณต ๊ณต๋ฐฑ ์ œ๊ฑฐ ํŠน์ • ๋ฌธ์ž์—ด์—ย ๋Œ€ํ•ด์„œย ์ค‘๋ณต ๊ณต๋ฐฑ ์ œ๊ฑฐ๋ฅผย ํ•˜๊ณ ย ์‹ถ๋‹ค๋ฉดย postgresqlย ์ •๊ทœ์‹์„ย ์‚ฌ์šฉํ•ด์„œย ๊ฐ€๋Šฅํ•˜๋‹ค. (๊ณต๋ฐฑ ์™ธ์— ๋‹จ์ผ ๋ฌธ์ž์— ๋Œ€ํ•œ ์ค‘๋ณต์ œ๊ฑฐ๋„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.) select regexp_replace(name, ' +', ' ', 'g') from TABLE; -- 'g' ์˜ต์…˜์„ ์ œ๊ฑฐํ•  ๊ฒฝ์šฐ ์ตœ์ดˆ ๊ฑด์— ๋Œ€์—์„œ๋งŒ ๋ณ€๊ฒฝ 2. ์ค‘๋ณต ๋‹จ์–ด ์ œ๊ฑฐ ์ปฌ๋Ÿผ ๋‹จ์œ„ ์ค‘๋ณต์ œ๊ฑฐ๋Š” distinct, group by๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ปฌ๋Ÿผ ๋‚ด ๋ฌธ์ž์—ด์˜ ์ค‘๋ณต ๋‹จ์–ด ์ œ๊ฑฐ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ์ปฌ๋Ÿผ์„ ๋ถ„๋ฆฌ, ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ํ›„ ๋‹ค์‹œ ์—ฐ๊ฒฐ) ...

[PostgreSQL] BRIN ์ธ๋ฑ์Šค์˜ ์›๋ฆฌ ๋ฐ ํŠน์ง•

[PostgreSQL] BRIN ์ธ๋ฑ์Šค์˜ ์›๋ฆฌ ๋ฐ ํŠน์ง•

1. BRIN ์ธ๋ฑ์Šค๋ž€? โ–ช Block range index์˜ ์•ฝ์ž โ–ช Page ๊ฒ€์ƒ‰์— ๋„์›€ ๋˜๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„์„œ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑ (ex, ํŠน์ •์ปฌ๋Ÿผ์˜ ์ตœ๋Œ€/์ตœ์†Ÿ๊ฐ’) โ–ช ํŠน์ • ์ปฌ๋Ÿผ์ด ๋ฌผ๋ฆฌ ์ฃผ์†Œ์˜ ์ผ์ •ํ•œ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ๋งค์šฐ ํฐ ํ…Œ์ด๋ธ”์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ (ํƒ€์ž„์‹œ์ฟผ์Šคํ•œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์กฐํšŒ์— ์œ ์šฉ) Block range๋Š” ํ…Œ์ด๋ธ” ๋‚ด์—์„œ ๊ทผ์ ‘ํ•œ ๋ฌผ๋ฆฌ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ page ๊ทธ๋ฃน์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ Block range ์— ๋Œ€ํ•ด ์ผ๋ถ€ ์š”์•ฝ ์ •๋ณด๊ฐ€ ์ธ๋ฑ์Šค๋กœ ์ €์žฅ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์ ์˜ ํŒ๋งค ์ฃผ๋ฌธ์„ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์—๋Š” ๊ฐ ์ฃผ๋ฌธ์ด ๋ฐฐ์น˜๋œ ๋‚ ์งœ ์—ด์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด์ „ ์ฃผ๋ฌธ์‹œ์ ์— ๋งž๊ฒŒ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฃผ๋ฌธ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒƒ์ด๊ณ , ZIP ์ฝ”๋“œ ์—ด์„ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์—๋Š” ๋„์‹œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทธ๋ฃนํ™”๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ...

[PostgreSQL] GIN์ธ๋ฑ์Šค์˜ ์›๋ฆฌ ๋ฐ ํŠน์ง•

[PostgreSQL] GIN์ธ๋ฑ์Šค์˜ ์›๋ฆฌ ๋ฐ ํŠน์ง•

1. GIN ์ธ๋ฑ์Šค๋ž€? Generalized Inverted Index์˜ ์•ฝ์ž์ด๋‹ค. ์ด์ „ ํฌ์ŠคํŠธ์ธ full text search์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ์œ ํ˜•. ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” B-tree์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ €์žฅ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๋‹ค.ย ์ €์žฅ๋œ ์š”์†Œ ์ž์ œ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰์ด ์•„๋‹Œ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ split ํ•œ token์ธ lexeme ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ•œ๋‹ค. array_ops, tsvector_ops, jsonb_ops, jsonb_path_ops ๋“ฑ ์˜ built-in operators๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 2. full text search์—์„œ์˜ ์ ์šฉ 2-1. ์ƒ˜ํ”Œ ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ create table ts(doc text, doc_tsv tsvector); insert into ts(doc) values ('Can a sheet slitter slit sheets?'), ('How many sheets could a sheet slitter slit?'), ('I slit a sheet, a sheet I slit.'), ('Upon a slitted sheet I sit.'), ('Whoever slit the sheets is a good sheet slitter.'), ('I am a sheet slitter.'), ('I slit sheets.'), ('I am the sleekest sheet slitter that ever slit sheets.'), ('She slits the sheet she sits on.'); update ts set doc_tsv = to_tsvector(doc); create index on ts using gin(doc_tsv); select doc from ts where doc_tsv @@ to_tsquery('many & slitter'); 2-2. ์กฐํšŒ ๊ฒฐ๊ณผ ๋ฐ ํ”Œ๋žœ ํ™•์ธ QUERY PLAN --------------------------------------------------------------------- Bitmap Heap Scan on ts Recheck Cond: (doc_tsv @@ to_tsquery('many & slitter'::text)) -> Bitmap Index Scan on ts_doc_tsv_idx Index Cond: (doc_tsv @@ to_tsquery('many & slitter'::text)) (4 rows) ...