Wydano wydanie bazy danych DuckDB 0.6.0, które łączy cechy SQLite, takie jak kompaktowość, możliwość użycia jako wbudowanej biblioteki, przechowywanie bazy danych w jednym pliku oraz wygodny interfejs CLI, z narzędziami i optymalizacjami do wykonywania zapytań analitycznych obejmujących znaczną część przechowywanych danych, na przykład agregującym wszystkie zawartości tabel lub łączącym kilka dużych tabel. Kod projektu jest dostępny na licencji MIT. Rozwój znajduje się obecnie na etapie kształtowania wersji eksperymentalnych, ponieważ format przechowywania nie został jeszcze ustabilizowany i zmienia się z wersji na wersję.
DuckDB oferuje rozszerzoną wersję języka SQL, w tym dodatkowe możliwości obsługi bardzo skomplikowanych i długotrwałych zapytań. Obsługiwane są złożone typy (tablice, struktury, unie) oraz możliwość wykonywania dowolnych i zagnieżdżonych zapytań korelujących. Obsługiwane jest równoczesne wykonywanie wielu zapytań, wykonywanie zapytań bezpośrednio z plików w formacie CSV i Parquet. Możliwy jest import z bazy danych PostgreSQL.
Oprócz kodu powłoki z SQLite, projekt korzysta z parsera PostgreSQL przeniesionego do oddzielnej biblioteki, komponentu Date Math z MonetDB, własnej implementacji funkcji okiennych (opartej na algorytmie Segment Tree Aggregation), obsługi wyrażeń regularnych opartej na bibliotece RE2, własnego optymalizatora zapytań, mechanizmu MVCC do zarządzania równoległym wykonywaniem zadań (Multi-Version Concurrency Control), a także wektorowego silnika wykonywania zapytań opartego na algorytmie Hyper-Pipelining Query Execution, umożliwiającego w jednej operacji przetwarzanie dużych zbiorów wartości.
Wśród zmian w nowej wersji:
- Prace nad udoskonaleniem formatu przechowywania zostały kontynuowane. Wprowadzono optymistyczny tryb zapisu na dysk, w którym przy ładowaniu dużego zestawu danych w jednej transakcji dane są kompresowane i w trybie strumieniowym zapisywane do pliku bazy danych, bez czekania na zakończenie potwierdzenia transakcji poleceniem COMMIT. W momencie wydania polecenia COMMIT dane są już zapisane na dysku, a podczas wykonywania ROLLBACK — odrzucane. Wcześniej dane były najpierw w pełni przechowywane w pamięci, a po potwierdzeniu zapisywane na dysku.
- Dodano wsparcie dla równoległego ładowania danych do oddzielnych tabel, co znacznie zwiększa szybkość ładowania na systemach wielordzeniowych. Na przykład w poprzedniej wersji ładowanie bazy danych z 150 mln wierszy na 10-rdzeniowym CPU zajmowało 91 sekund, a w nowej wersji ta operacja trwa 17 sekund. Zapewniono dwa tryby równoległego ładowania — z zachowaniem kolejności rekordów i bez zachowania kolejności.
- Do kompresji danych wykorzystano algorytm FSST (Fast Static Symbol Table), który umożliwia pakowanie danych wewnątrz ciągów, wykorzystując wspólny słownik typowych dopasowań. Zastosowanie nowego algorytmu pozwoliło zmniejszyć rozmiar testowej bazy danych z 761 MB do 251 MB.
- Do kompresji liczb zmiennoprzecinkowych (DOUBLE i FLOAT) zaproponowano algorytmy Chimp i Patas. W porównaniu do wcześniej stosowanego algorytmu Gorillas, Chimp zapewnia wyższy poziom kompresji i szybsze dekompresowanie. Algorytm Patas ustępuje Chimp pod względem stopnia kompresji, ale jest znacznie szybszy w dekompresji, która niemal nie różni się od odczytu niekompresowanych danych.
- Dodano eksperymentalną możliwość ładowania danych z plików CSV w kilku równoległych wątkach (SET experimental_parallel_csv=true), co znacznie skraca czas ładowania dużych plików CSV. Na przykład, przy włączonej opcji, czas ładowania pliku CSV o wielkości 720 MB skrócił się z 3.5 do 0.6 sekund.
- Zrealizowano możliwość równoległego wykonywania operacji tworzenia i zarządzania indeksami. Na przykład, wykonanie operacji CREATE INDEX dla kolumny z 16 mln rekordów skróciło się z 5.92 do 1.38 sekund.
- Zapewniono równoległe przetwarzanie operacji agregujących w zapytaniach, które zawierają wyrażenie „COUNT(DISTINCT col)”.
- W SQL dodano wsparcie dla typu UNION, który pozwala na powiązanie kilku typów z jednym elementem (np. „UNION(num INT, error VARCHAR))”).
- W SQL udostępniono możliwość tworzenia zapytań, które zaczynają się od słowa „FROM” zamiast „SELECT”. W tym przypadku zakłada się, że zapytanie zaczyna się od „SELECT *”.
- W SQL dodano wsparcie dla wyrażenia „COLUMNS”, które pozwala na wykonanie operacji na kilku kolumnach bez powtarzania wyrażenia. Na przykład, „SELECT MIN(COLUMNS(*)) from obs;” spowoduje wykonanie funkcji MIN dla każdej kolumny w tabeli obs, a „SELECT COLUMNS(‘val[0-9]+’) from obs;” dla kolumn o nazwie składającej się z „val” i cyfr.
- Dodano wsparcie dla operacji na listach, na przykład „SELECT [x + 1 for x in [1, 2, 3]] AS l;”.
- Przeprowadzono optymalizację zużycia pamięci. Domyślnie na platformie Linux do zarządzania pamięcią wykorzystana jest biblioteka jemalloc. Znacznie poprawiono wydajność operacji łączenia hashy w ograniczonym rozmiarze pamięci.
- W interfejsie wiersza poleceń dodano tryb wyjścia „.mode duckbox”, który odrzuca średnie kolumny, biorąc pod uwagę szerokość okna terminala (idealny do szybkie wizualne oceny wyników zapytań z dużą liczbą kolumn, takich jak „SELECT * FROM tbl”, które w normalnym trybie rozciągają się na kilka linii). Dodatkowo za pomocą parametru „.maxrows X” można ograniczyć liczbę wyświetlanych wierszy.
- W CLI zapewniono automatyczne uzupełnianie wejścia z uwzględnieniem kontekstu (uzupełniane są wprowadzane słowa kluczowe, nazwy tabel, funkcji, kolumn i plików).
- W CLI domyślnie wyświetlany jest wskaźnik postępu wykonywania zapytania.
Źródło: opennet.ru
