DBMS SQLite 3.42 ๋ฐ DuckDB 0.8.0 ๋ฆด๋ฆฌ์Šค. SQLite์šฉ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ๊ตฌํ˜„ํ•œ CG/SQL

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์„ค๊ณ„๋œ ๊ฒฝ๋Ÿ‰ DBMS์ธ SQLite 3.42์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SQLite ์ฝ”๋“œ๋Š” ๊ณต๊ฐœ ๋„๋ฉ”์ธ์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ๋“  ์ œํ•œ ์—†์ด ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SQLite ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์žฌ์ •์  ์ง€์›์€ Adobe, Oracle, Mozilla, Bentley ๋ฐ Bloomberg์™€ ๊ฐ™์€ ํšŒ์‚ฌ๋ฅผ ํฌํ•จํ•˜๋Š” ํŠน๋ณ„ํžˆ ๊ตฌ์„ฑ๋œ ์ปจ์†Œ์‹œ์—„์—์„œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ :

  • FTS5 ์ „์ฒด ํ…์ŠคํŠธ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ๋ณด์•ˆ ์‚ญ์ œ ๋ช…๋ น์ด ๊ตฌํ˜„๋˜์–ด ์‚ญ์ œ ํ›„ ๋ชจ๋“  ์ž”์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์™„์ „ํžˆ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ด์ œ JSON5 ํ™•์žฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ํ–ฅ์ƒ๋œ ์ฟผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ. ์กฐํšŒ์ˆ˜ ์ตœ์ ํ™”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์—ด ์ฒ˜๋ฆฌ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ‘ธ์‹œ๋‹ค์šด ์ตœ์ ํ™” ๊ตฌํ˜„์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ".testctrl"๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์œ„ํ—˜ํ•œ ๋ช…๋ น์„ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก CLI์— "--unsafe-testing" ์˜ต์…˜์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ ๋ชจ๋“œ("--safe")์—์„œ๋Š” ".log on" ๋ฐ ".log off" ๋ช…๋ น์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ์ดํ›„์˜ ์ธ์ˆ˜์— ๋Œ€ํ•œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ "โ€”"์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ๋Œ€ ๋ฐ NaN ๊ฐ’๊ณผ ๊ด€๋ จ๋œ ":inf" ๋ฐ ":nan" ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •์˜ SQL ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ CROSS, FULL, INNER, LEFT, NATURAL, OUTER ๋ฐ RIGHT ํ‚ค์›Œ๋“œ์™€ ๊ต์ฐจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™•์žฅ๋œ PRAGMA integrity_check ๊ธฐ๋Šฅ. NOT NULL ์กฐ๊ฑด์ด ์žˆ๋Š” ์—ด์— NaN ๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์ •๋ณด ๋‚ด์šฉ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์„ธ์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ROWID๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ดˆ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„ ๋ฐ ๋‚ ์งœ ์ž‘์—…์„ ์œ„ํ•œ ํ•จ์ˆ˜์— "subsec" ํ•œ์ •์ž๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด ๋ฐ JSON ๊ฐœ์ฒด์˜ ๊ธฐ๋ณธ ์žฌ๊ท€ ๊นŠ์ด๊ฐ€ 2000์—์„œ 1000์œผ๋กœ ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

์ƒˆ ๋ฒ„์ „์˜ DuckDB์—์„œ:

  • ํ–‰์„ ์—ด๋กœ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ƒˆ ํ‘œํ˜„์‹ "PIVOT" ๋ฐ "UNPIVOT"์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚ด๋ณด๋‚ผ ๋•Œ ๋ณ‘๋ ฌํ™”๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ CSV ํ˜•์‹์˜ ํŒŒ์ผ์—์„œ ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ฝ๊ธฐ ๋ฐ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์“ฐ๊ธฐ๋Š” Parquet, CSV ๋ฐ JSON ํ˜•์‹์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ๊ฒฝ๋กœ(์˜ˆ: FROM "'data/glob/crawl/stackoverflow/**/*.csv';")๋ฅผ ์ •์˜ํ•  ๋•Œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋Š” "**" ์—ฐ์‚ฐ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ฝ”๋“œ ๋ณ‘ํ•ฉ ๊ธฐ์ค€์ด ์ •ํ™•ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ’์˜ ๋Œ€๋žต์ ์ธ ์ผ์น˜์ธ ์‹œ๊ณ„์—ด(์ง€์ •๋œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’ ์กฐ๊ฐ) ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ž‘์—…(JOIN)์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์žˆ๋Š” ํ•„๋“œ์—์„œ(์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ๊ฐ„์ด 1๋ถ„ ์ด์ƒ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Œ)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์ง€์—ฐ ๋กœ๋”ฉ์ด ๊ตฌํ˜„๋˜์–ด DBMS ์‹คํ–‰ ์†๋„๋ฅผ ์ˆ˜์‹ญ ๋ฐฐ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Python์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Apache Arrow๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ADBC โ€‹โ€‹(Arrow Database Connectivity) API์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Swift ์ฝ”๋“œ์™€์˜ ํ†ตํ•ฉ์„ ์œ„ํ•ด ๋ฐ”์ธ๋”ฉ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์ˆ˜ ์—ฐ์‚ฐ ๋Œ€์‹  ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚˜๋ˆ„๊ธฐ("/") ์—ฐ์‚ฐ์ž์˜ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ •์ˆ˜ ๋‚˜๋ˆ—์…ˆ์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ž "//"๊ฐ€ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋™์ž‘์€ "SET integer_division=true;"๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ •๋ ฌ ์‹œ null ๋ ˆ์ฝ”๋“œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด "NULLS FIRST"์—์„œ "NULLS LAST"๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. NULL ๊ฐ’์€ ์ด์ œ ๋ชฉ๋ก์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์ด ์•„๋‹Œ ๋์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋™์ž‘์€ "SET default_null_order='nulls_first';"๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ SQLite์™€ ํ•จ๊ป˜ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” Facebook์—์„œ ๊ฐœ๋ฐœํ•œ CG/SQL ํ”„๋กœ์ ํŠธ๋ฅผ ์–ธ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CG/SQL์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‘œ์ค€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๊ณ  SQLite์˜ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” T-SQL(Transact-SQL)์˜ ํŠน์ˆ˜ ์–ธ์–ด๋กœ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋Š” SQLite C API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” C ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋Š” C, Java ๋ฐ Objective-C ํ”„๋กœ๊ทธ๋žจ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” C๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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