Opublikowano wydanie bazy danych DuckDB 1.2.0, skoncentrowanej na wykonywaniu zapytań analitycznych i koncepcyjnie przypominającej SQLite. DuckDB łączy cechy SQLite, takie jak kompaktowość, możliwość podłączenia w formie biblioteki do osadzenia, przechowywanie bazy danych w jednym pliku oraz interfejs CLI, z możliwościami i optymalizacjami do wykonywania zapytań analitycznych, obejmujących znaczną część przechowywanych danych, na przykład agregację całej zawartości tabel lub łączenie kilku dużych tabel. Kod projektu napisany jest w języku C++ i jest rozpowszechniany na licencji MIT.
DuckDB oferuje rozszerzony dialekt języka SQL, który zawiera dodatkowe możliwości przetwarzania bardzo skomplikowanych i długotrwałych zapytań. Możliwe jest użycie złożonych typów (tablice, struktury, unie), a także wykonywanie dowolnych i zagnieżdżonych zapytań skorelowanych. Obsługiwane jest równoległe wykonywanie wielu zapytań oraz realizacja zapytań bezpośrednio z plików w formatach CSV i Parquet. Dostępne jest wsparcie dla importu z systemów DB PostgreSQL.
Projekt wykorzystuje powłokę SQLite, parser PostgreSQL, komponent Date Math z MonetDB, własną implementację funkcji okiennych (na podstawie algorytmu Segment Tree Aggregation), obsługiwacz wyrażeń regularnych oparty na bibliotece RE2, a także własny optymalizator zapytań, mechanizm MVCC do zarządzania równoległym wykonaniem zadań (Multi-Version Concurrency Control) oraz wektoryzowany silnik wykonywania zapytań oparty na algorytmie Hyper-Pipelining Query Execution, który pozwala na jednoczesne przetwarzanie dużych zbiorów wartości w jednej operacji.
W nowej wersji:
- Zrealizowano wsparcie dla nowych metod kompresji, które nie są domyślnie włączone dla zachowania zgodności plików bazy danych z wcześniejszymi wersjami DuckDB. Aby móc korzystać z ulepszonego formatu plików bazy danych, zaproponowano możliwość powiązania bazy danych z numerem wersji — przy otwieraniu pliku za pomocą parametru „STORAGE_VERSION” teraz można określić minimalnie obsługiwaną wersję bazy danych („ATTACH ‘file.db’ (STORAGE_VERSION ‘v1.2.0’);”). Aby przekonwertować nowy format na starszy, można użyć polecenia SQL COPY, na przykład: ATTACH ‘file1.db’; ATTACH ‘converted_file.db’ (STORAGE_VERSION ‘v1.0.0’); COPY FROM DATABASE file1 TO converted_file;
- Dodano wsparcie dla polecenia SQL „ALTER TABLE … ADD PRIMARY KEY” do dodawania klucza głównego do istniejącej tabeli.
- Usunięto ograniczenie, które nie pozwalało na ponowne dodawanie identyfikatorów, dla których istniał indeks śledzenia unikalności, jeśli dane identyfikatory zostały usunięte w bieżącej transakcji. Na przykład poniższy kod SQL nie prowadzi już do błędu: CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR); INSERT INTO students VALUES (1, ‘John Doe’); BEGIN; DELETE FROM students WHERE id = 1; INSERT INTO students VALUES (1, ‘Jane Doe’);
- Dodano wsparcie dla ładowania plików CSV w kodowaniach Latin-1 i UTF-16 (wcześniej obsługiwano tylko kodowanie UTF-8). FROM read_csv(‘cities-latin-1.csv’, encoding = ‘latin-1’);
- Dodano wsparcie dla użycia w plikach CSV wielobajtowych separatorów (do 4 bajtów), co pozwala na użycie emoji jako separatora kolumn. a🦆b hello🦆world FROM read_csv(‘example.dsv’, sep = ‘🦆’);
- Domyślnie włączony jest tryb ścisłego przetwarzania plików CSV („strict_mode = true”), który sprawdza zgodność z formatowaniem specyfikacji RFC 4180. W trybie ścisłym dozwolone jest użycie tylko jednego znaku do oddzielania wierszy, co spowoduje błąd przy próbie przetwarzania plików, w których używa się nie tylko znaku nowej linii, ale i znaku powrotu kursora („\r\n”).
- W parserze CSV zastosowano nowy algorytm wykrywania nowej linii, wspierający równoległość operacji. Użycie nowego algorytmu przyspieszyło przetwarzanie CSV o około 15%.
- Usunięto ograniczenie dotyczące rozmiaru wiersza w plikach CSV (wcześniej wiersz nie mógł przekraczać 8 MB).
- Przy eksporcie danych w formacie Parquet wprowadzono wsparcie dla hashy (słowników) i indeksów opartych na filtrze Blooma. Wprowadzono metodę kompresji DELTA_BINARY_PACKED, która znacząco zmniejsza rozmiar plików Parquet.
- W interfejsie wiersza poleceń dodano tryb bezpieczny, aktywowany za pomocą opcji „-safe” lub polecenia „.safe_mode”. W tym trybie dostęp dozwolony jest tylko do początkowo określonego pliku bazy danych, a próba otwarcia innych plików spowoduje wyświetlenie błędu.
- W interfejsie wiersza poleceń poprawiono automatyczne uzupełnianie wejścia. Kod do automatycznego uzupełniania przetłumaczono na użycie PEG (Gramatyki Wyrażeń Parsowania).
- Podczas wykonywania poleceń w interfejsie wiersza poleceń wprowadzono wizualne wyświetlanie dużych liczb, na przykład przy wyświetlaniu liczby 100000000 dodatkowo będzie zapisywane „(100 milionów)”.
- W SQL dodano wsparcie dla składni, w której skrócone nazwy tabel i wyrażeń można podawać przed wartościami, do których się odnoszą (zamiast używać składni „wyrażenie AS nazwa”): SELECT e1: some_long_and_winding_expression, e2: t2.a_column_name FROM t1: long_schema.some_long_table_name, t2: short_s.tbl;
- W poleceniu „SELECT” wprowadzono wsparcie dla operacji „RENAME” do zmiany nazw pól, które są wyświetlane przy wskazaniu wyrażenia „*”: SELECT * RENAME (col1 AS new_col1) FROM integers;
- W poleceniu „SELECT” zezwolono na użycie operacji „LIKE” i „SIMILAR TO” przy wyświetlaniu przez „*”: SELECT * LIKE ‘val%’ FROM key_val;
- Zwiększono jakość generowania liczb pseudo-losowych.
- Zmodernizowano optymalizator zapytań. Wydajność podczas testu TPC-H SF100 wzrosła o 13%.
- Zaproponowano nowe API podobne do C do tworzenia dodatków, które można wykorzystać, na przykład, do tworzenia nowych funkcji agregujących lub tabelarycznych.
- Dodano wsparcie dla systemów ze standardową biblioteką C Musl.
Źródło: opennet.ru
