Апублікаваны DuckDB 0.6.0, варыянт SQLite для аналітычных запытаў

Даступны выпуск СКБД DuckDB 0.6.0, якая спалучае такія ўласцівасці SQLite, як кампактнасць, магчымасць падлучэння ў форме ўбудаванай бібліятэкі, захоўванне БД у адным файле і зручны CLI-інтэрфейс, са сродкамі і аптымізацыямі для выканання аналітычных запытаў, якія ахопліваюць значную частку захоўваемых дадзеных, напрыклад , якія выконваюць агрэгавання за ўсё змесціва табліц або зліццё некалькіх вялікіх табліц. Код праекту распаўсюджваецца пад ліцэнзіяй MIT. Распрацоўка пакуль знаходзіцца на стадыі фармавання эксперыментальных выпускаў, бо фармат сховішчы пакуль не стабілізаваны і змяняецца ад версіі да версіі.

У DuckDB падаецца пашыраны дыялект мовы SQL, улучальны дадатковыя магчымасці для апрацоўкі вельмі складаных і доўга выкананых запытаў. Падтрымліваецца выкарыстанне складаных тыпаў (масівы, структуры, аб'яднанні) і магчымасць выканання адвольных і ўкладзеных карэлюючых подзапросов. Падтрымліваецца адначасовае выкананне некалькіх запытаў, выкананне запытаў напрамую з файлаў у фармаце CSV і Parquet. Маецца магчымасць імпарту з СКБД PostgreSQL.

Апроч кода абалонкі з SQLite праектам выкарыстоўваецца вынесены ў асобную бібліятэку парсер з PostgreSQL, кампанент Date Math з MonetDB, свая рэалізацыя аконных функцый (на базе алгарытму Segment Tree Aggregation), апрацоўшчык рэгулярных выразаў на аснове бібліятэкі RE2, уласныя аптымізатар запытаў, MVCC-механізм кіравання адначасовым выкананнем заданняў (Multi-Version Concurrency Control), а таксама вектарызаваны рухавічок выканання запытаў на базе алгарытму Hyper-Pipelining Query Execution, які дазваляе ў адной аперацыі зараз апрацоўваць вялікія наборы значэнняў.

Сярод змен у новым выпуску:

  • Прадоўжана работа па ўдасканаленні фармату захоўвання. Рэалізаваны аптымістычны рэжым запісу на дыск, пры якім пры загрузцы буйнога набору дадзеных у адной транзакцыі, дадзеныя сціскаюцца і ў струменевым рэжыме запісваюцца ў файл з БД, не чакаючы завяршэнні пацверджання транзакцыі камандай COMMIT. Падчас паступлення каманды COMMIT дадзеныя апыняюцца ўжо запісанымі на кружэлку, а пры выкананні ROLLBACK - адкідаюцца. Раней дадзеныя спачатку цалкам захоўваліся ў памяць, а пры коміце захоўваліся на дыск.
  • Дададзена падтрымка паралельнай загрузкі дадзеных у асобныя табліцы, якая дазваляе прыкметна павысіць хуткасць загрузкі на шмат'ядравых сістэмах. Напрыклад, у мінулым выпуску загрузка БД са 150 млн радкоў на 10-ядзерным CPU займала 91 секунду, а ў новай версіі дадзеная аперацыя выконваецца за 17 секунд. Прадугледжана два рэжымы паралельнай загрузкі - з захаваннем парадку прытрымлівання запісаў і без захавання парадку.
  • Для сціску дадзеных задзейнічаны алгарытм FSST (Fast Static Symbol Table), які дазваляе спакаваць дадзеныя ўнутры радкоў, выкарыстоўваючы агульны слоўнік тыпавых супадзенняў. Ужыванне новага алгарытму дазволіла скараціць памер тэставай БД з 761MB да 251MB.
  • Для сціску лікаў з якая плавае коскі (DOUBLE і FLOAT) прапанаваны алгарытмы Chimp і Patas. У параўнанні з раней ужывальным алгарытмам Gorillas, Chimp забяспечвае больш высокі ўзровень сціску і хутчэйшую распакаванне. Алгарытм Patas адстае па ступені сціску ад Chimp, але значна хутчэй па хуткасці распакавання, якая амаль не адрозніваецца ад чытання несціснутых дадзеных.
  • Дададзена эксперыментальная магчымасць загрузкі дадзеных з файлаў CSV у некалькі раўналежных струменяў (SET experimental_parallel_csv=true), якая істотна скарачае час загрузкі буйных CSV-файлаў. Напрыклад, пры ўключэнні опцыі час загрузкі CSV-файла памерам 720 МБ скарацілася з 3.5/0.6 да XNUMX секунд.
  • Рэалізавана магчымасць паралельнага выканання аперацый стварэння і кіравання індэксамі. Напрыклад, выкананне аперацыі CREATE INDEX для слупка з 16 млн запісаў скарацілася з 5.92 да 1.38 секунд.
  • Забяспечана распаралельванне аперацый агрэгавання ў запытах, якія змяшчаюць выраз «COUNT(DISTINCT col)».
  • У SQL дададзеная падтрымка тыпу UNION, які дапускае прывязку да аднаго элемента некалькіх тыпаў (напрыклад, «UNION(num INT, error VARCHAR))»).
  • У SQL прадстаўлена магчымасць фармавання запытаў, якія пачынаюцца на слова "FROM" замест "SELECT". У гэтым выпадку маецца на ўвазе, што запыт пачынаецца на "SELECT *".
  • У SQL дададзеная падтрымка выраза «COLUMNS», які дазваляе выканаць аперацыю над некалькімі слупкамі без дублявання выраза. Напрыклад, "SELECT MIN(COLUMNS(*)) from obs;" прывядзе да выканання функцыі MIN для кожнага слупка ў табліцы obs, а "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

Дадаць каментар