Opublikowano wydanie systemu DB DuckDB 1.4.0, zaprojektowanego do realizacji zapytań analitycznych, koncepcyjnie przypominające SQLite. DuckDB łączy cechy SQLite, takie jak kompaktowość, możliwość użycia jako wbudowanej biblioteki, przechowywanie bazy danych w jednym pliku oraz interfejs CLI, z funkcjami i optymalizacjami do realizacji 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 został napisany w języku C++ i jest udostępniany 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:
- Dodano wsparcie dla przechowywania plików bazy danych w zaszyfrowanej formie. Do szyfrowania używany jest algorytm AES-256 w trybie GCM. Szyfrowany jest nie tylko główny plik z danymi, ale także logi WAL i pliki tymczasowe. Klucze do szyfrowania bazy danych są definiowane poleceniem ATTACH z parametrem ENCRYPTION_KEY. ATTACH 'encrypted.db' AS enc_db (ENCRYPTION_KEY 'quack_quack');
- Dodano wsparcie dla polecenia „MERGE INTO”, które może być stosowane jako alternatywa dla wyrażenia „INSERT … ON CONFLICT”, nie wymagające klucza głównego i działające z dowolnymi warunkami łączenia. Polecenie „MERGE INTO” pozwala na tworzenie warunkowych wyrażeń SQL, łączących w jednym wyrażeniu operacje INSERT, UPDATE i DELETE. Na przykład, za pomocą MERGE można zorganizować łączenie dwóch tabel, wstawiając brakujące rekordy i aktualizując istniejące. WITH deletes(item_id, delete_threshold) AS (VALUES (10, 3000)) MERGE INTO Stock USING deletes USING (item_id) WHEN MATCHED AND balance < delete_threshold THEN DELETE RETURNING merge_action, *;
- Oprócz tego, dodano wsparcie dla operacji zapisu w przypadku pracy z tabelami w formacie Apache Iceberg (wcześniej wspierano tylko odczyt), co pozwala na przenoszenie danych z Iceberg do DuckDB i z powrotem.
- W klienta wiersza poleceń dodano wskaźnik postępu operacji z prognozą czasu pozostałego do zakończenia.
- Dodano funkcję okna „FILL”, którą można wykorzystać do interpolacji brakujących wartości w uporządkowanych oknach. FROM (VALUES (1, 1), (2, NULL), (3, 42)) t(c1, c2) SELECT fill(c2) OVER (ORDER BY c1) f; 1 21 42
- Zrealizowano dodatek Teradata Connector do łączenia z bazami danych Teradata. Dodatek umożliwia manipulację tabelami, wykonywanie zapytań i uruchamianie poleceń SQL bezpośrednio w Teradata, używając DuckDB.
- Dodano wsparcie dla punktów kontrolnych (checkpoint) tabel przechowywanych w pamięci, co pozwoliło na wsparcie kompresji. Ponadto podczas punktu kontrolnego wykonywana jest dezynfekcja usuniętych wierszy i zwalnianie miejsca po operacjach usunięcia. ATTACH ‘:memory:’ AS memory_compressed (COMPRESS);
- Zaproponowano kilka optymalizacji wydajności: Implementacja sortowania została przetworzona na wykorzystanie algorytmu wielościeżkowego scalania (k-way merge sort), co zmniejsza ruch danych. Uogólnione wyrażenia tabelaryczne (Common Table Expression, CTE) są teraz domyślnie materializowane.
Źródło: opennet.ru
