Достъпен е изданието на СУБД 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
