DuckDB 0.6.0, ๋ถ„์„ ์ฟผ๋ฆฌ์šฉ SQLite ๋ณ€ํ˜• ๊ฒŒ์‹œ๋จ

DuckDB 0.6.0 DBMS์˜ ์ถœ์‹œ๋Š” ์ปดํŒฉํŠธํ•จ, ์ž„๋ฒ ๋””๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ, ํŽธ๋ฆฌํ•œ CLI ์ธํ„ฐํŽ˜์ด์Šค, ์‹คํ–‰์„ ์œ„ํ•œ ๋„๊ตฌ ๋ฐ ์ตœ์ ํ™”์™€ ๊ฐ™์€ SQLite์˜ ์†์„ฑ์„ ๊ฒฐํ•ฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ๋‚ด์šฉ์„ ์ง‘๊ณ„ํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํฐ ํ…Œ์ด๋ธ”์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๋“ฑ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ๋‹ค๋ฃจ๋Š” ๋ถ„์„ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ ํ˜•์‹์ด ์•„์ง ์•ˆ์ •ํ™”๋˜์ง€ ์•Š์•˜๊ณ  ๋ฒ„์ „๋ณ„๋กœ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์€ ์•„์ง ์‹คํ—˜์ ์ธ ๋ฆด๋ฆฌ์Šค๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

DuckDB๋Š” ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ๊ณ ๊ธ‰ SQL ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์œ ํ˜•(๋ฐฐ์—ด, ๊ตฌ์กฐ, ๊ณต์šฉ์ฒด)์˜ ์‚ฌ์šฉ๊ณผ ์ž„์˜ ๋ฐ ์ค‘์ฒฉ๋œ ์ƒ๊ด€ ํ•˜์œ„ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜์—ฌ CSV ๋ฐ Parquet ํŒŒ์ผ์—์„œ ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PostgreSQL DBMS์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQLite์˜ ์…ธ ์ฝ”๋“œ ์™ธ์—๋„ ํ”„๋กœ์ ํŠธ๋Š” ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š” PostgreSQL์˜ ํŒŒ์„œ, MonetDB์˜ Date Math ๊ตฌ์„ฑ ์š”์†Œ, ์ž์ฒด ์ฐฝ ํ•จ์ˆ˜ ๊ตฌํ˜„(์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ์ง‘๊ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฐ˜), ์ •๊ทœ์‹ ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. RE2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ž์ฒด ์ฟผ๋ฆฌ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ, MVCC ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋™์‹œ ์ž‘์—… ์‹คํ–‰(Multi-Version Concurrency Control), ๊ทธ๋ฆฌ๊ณ  ๋Œ€๊ทœ๋ชจ ๊ฐ’ ์„ธํŠธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Hyper-Pipelining Query Execution ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฐ˜์˜ ๋ฒกํ„ฐํ™”๋œ ์ฟผ๋ฆฌ ์‹คํ–‰ ์—”์ง„ โ€‹โ€‹ํ•œ ๋ฒˆ์˜ ์ž‘์—…์œผ๋กœ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ฆด๋ฆฌ์Šค์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ €์žฅ ํ˜•์‹์„ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—…์ด ๊ณ„์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋กœ๋“œํ•  ๋•Œ COMMIT ๋ช…๋ น์œผ๋กœ ํŠธ๋žœ์žญ์…˜์ด ํ™•์ธ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์••์ถ•๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŒŒ์ผ์— ๊ธฐ๋ก๋˜๋Š” ๋‚™๊ด€์  ๋””์Šคํฌ ์“ฐ๊ธฐ ๋ชจ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. . COMMIT ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜๋ฉด ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋””์Šคํฌ์— ๊ธฐ๋ก๋˜์–ด ์žˆ์œผ๋ฉฐ ROLLBACK์ด ์‹คํ–‰๋˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜์Œ์—๋Š” ์™„์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ์ปค๋ฐ‹๋˜๋ฉด ๋””์Šคํฌ์— ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ๋กœ๋“œํ•˜๋Š” ์ง€์›์ด ์ถ”๊ฐ€๋˜์–ด ๋ฉ€ํ‹ฐ ์ฝ”์–ด ์‹œ์Šคํ…œ์—์„œ ๋กœ๋“œ ์†๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” 150์ฝ”์–ด CPU์— 10์–ต 91์ฒœ๋งŒ ํ–‰์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ 17์ดˆ๊ฐ€ ๊ฑธ๋ ธ์ง€๋งŒ ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ์ด ์ž‘์—…์ด XNUMX์ดˆ ๋งŒ์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ชจ๋“œ์™€ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“œ์˜ ๋‘ ๊ฐ€์ง€ ๋ณ‘๋ ฌ ๋กœ๋“œ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์••์ถ•์˜ ๊ฒฝ์šฐ FSST(Fast Static Symbol Table) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜์ ์ธ ์ผ์น˜ ํ•ญ๋ชฉ์˜ ๊ณตํ†ต ์‚ฌ์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํฌ๊ธฐ๋ฅผ 761MB์—์„œ 251MB๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜(DOUBLE ๋ฐ FLOAT)๋ฅผ ์••์ถ•ํ•˜๊ธฐ ์œ„ํ•ด Chimp ๋ฐ Patas ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ Gorillas ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๊ตํ•˜์—ฌ Chimp๋Š” ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์••์ถ•๊ณผ ๋” ๋น ๋ฅธ ์••์ถ• ํ•ด์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Patas ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์••์ถ•๋ฅ ์—์„œ๋Š” Chimp์— ๋น„ํ•ด ๋’ค๋–จ์–ด์ง€์ง€๋งŒ ์••์ถ• ํ•ด์ œ ์†๋„์—์„œ๋Š” ํ›จ์”ฌ ๋นจ๋ผ์„œ ์••์ถ•๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • CSV ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ(SET Experiment_parallel_csv=true)์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ์‹คํ—˜์  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋Œ€์šฉ๋Ÿ‰ CSV ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด 720MB CSV ํŒŒ์ผ์˜ ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์ด 3.5์ดˆ์—์„œ 0.6์ดˆ๋กœ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ์ž‘์—…์˜ ๋ณ‘๋ ฌ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 16๋งŒ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ์—ด์— ๋Œ€ํ•œ CREATE INDEX ์ž‘์—…์ด 5.92์ดˆ์—์„œ 1.38์ดˆ๋กœ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • "COUNT(DISTINCT col)" ํ‘œํ˜„์‹์ด ํฌํ•จ๋œ ์ฟผ๋ฆฌ์—์„œ ์ง‘๊ณ„ ์ž‘์—…์˜ ๋ณ‘๋ ฌํ™”๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • SQL์—๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์„ ํ•˜๋‚˜์˜ ์š”์†Œ์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” UNION ์œ ํ˜•์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "UNION(num INT, error VARCHAR))").
  • SQL์€ "SELECT" ๋Œ€์‹  "FROM"์ด๋ผ๋Š” ๋‹จ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋Š” "SELECT *"๋กœ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • SQL์—๋Š” ํ‘œํ˜„์‹์„ ๋ณต์ œํ•˜์ง€ ์•Š๊ณ ๋„ ์—ฌ๋Ÿฌ ์—ด์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” COLUMNS ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, โ€œSELECT MIN(COLUMNS(*)) from obs;โ€ obs ํ…Œ์ด๋ธ”์˜ ๊ฐ ์—ด์— ๋Œ€ํ•ด MIN ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  "SELECT COLUMNS('val[0-9]+') from obs;" ์ด๋ฆ„์ด "val"๊ณผ ์ˆซ์ž๋กœ ๊ตฌ์„ฑ๋œ ์—ด์˜ ๊ฒฝ์šฐ.
  • ๋ชฉ๋ก ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "SELECT [x + 1 for x in [1, 2, 3]] AS l;").
  • ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์ตœ์ ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Linux ํ”Œ๋žซํผ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด jemalloc ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด์‹œ ๋ณ‘ํ•ฉ ์ž‘์—…์˜ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ„ฐ๋ฏธ๋„ ์ฐฝ์˜ ๋„ˆ๋น„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ค‘๊ฐ„ ์—ด์„ ์‚ญ์ œํ•˜๋Š” ".mode duckbox" ์ถœ๋ ฅ ๋ชจ๋“œ๋ฅผ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค("SELECT *์™€ ๊ฐ™์ด ๋งŽ์€ ์ˆ˜์˜ ์—ด์ด ํฌํ•จ๋œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์‹œ๊ฐ์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์ ํ•ฉ). FROM tblโ€, ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ".maxrows X" ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ์‹œ๋˜๋Š” ํ–‰ ์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CLI๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ๊ณ ๋ คํ•œ ์ž…๋ ฅ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(ํ‚ค์›Œ๋“œ, ํ…Œ์ด๋ธ” ์ด๋ฆ„, ํ•จ์ˆ˜, ์—ด ์ด๋ฆ„ ๋ฐ ํŒŒ์ผ ์ด๋ฆ„ ์ž…๋ ฅ์ด ์™„๋ฃŒ๋จ).
  • CLI์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟผ๋ฆฌ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ๊ธฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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