Опубліковано 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 секунд.
  • Реалізовано можливість паралельного виконання операцій створення та управління індексами. Наприклад, виконання операції 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

Додати коментар або відгук