Opublikowano DuckDB 0.6.0, wariant SQLite dla zapytań analitycznych

Dostępna jest wersja DuckDB 0.6.0 DBMS, łącząca takie właściwości SQLite jak zwartość, możliwość łączenia się w postaci wbudowanej biblioteki, przechowywanie bazy danych w jednym pliku oraz wygodny interfejs CLI, z narzędziami i optymalizacjami do wykonywania zapytania analityczne obejmujące znaczną część przechowywanych danych, np. agregujące całą zawartość tabel lub scalające kilka dużych tabel. Kod projektu jest rozpowszechniany na licencji MIT. Rozwój jest wciąż na etapie tworzenia wydań eksperymentalnych, ponieważ format przechowywania nie został jeszcze ustabilizowany i zmienia się z wersji na wersję.

DuckDB zapewnia zaawansowany dialekt SQL, który zawiera dodatkowe możliwości obsługi bardzo złożonych i czasochłonnych zapytań. Obsługiwane jest użycie typów złożonych (tablice, struktury, związki) oraz możliwość wykonywania dowolnych i zagnieżdżonych korelujących podzapytań. Obsługuje jednoczesne uruchamianie wielu zapytań, uruchamianie zapytań bezpośrednio z plików CSV i Parquet. Możliwe jest importowanie z DBMS PostgreSQL.

Oprócz kodu powłoki z SQLite, w projekcie wykorzystano parser z PostgreSQL w osobnej bibliotece, komponent Date Math z MonetDB, własną implementację funkcji okienkowych (oparta na algorytmie Segment Tree Aggregation), procesor wyrażeń regularnych oparty na biblioteka RE2, własny optymalizator zapytań oraz mechanizm kontrolny MVCC do jednoczesnego wykonywania zadań (Multi-Version Concurrency Control), a także wektoryzowany silnik wykonywania zapytań oparty na algorytmie Hyper-Pipelining Query Execution, który pozwala na duże zbiory wartości do natychmiastowego przetworzenia w jednej operacji.

Wśród zmian w nowej wersji:

  • Kontynuowano prace nad udoskonaleniem formatu przechowywania. Zaimplementowano optymistyczny tryb zapisu dyskowego, w którym podczas ładowania dużego zestawu danych w jednej transakcji dane są kompresowane i zapisywane do pliku z bazy danych w trybie strumieniowym, bez oczekiwania na zatwierdzenie transakcji komendą COMMIT . Po odebraniu polecenia COMMIT dane są już zapisane na dysku, a po wykonaniu polecenia ROLLBACK są one odrzucane. Wcześniej dane były początkowo w całości zapisywane w pamięci, a po zatwierdzeniu były zapisywane na dysku.
  • Dodano obsługę równoległego ładowania danych do oddzielnych tabel, co pozwala znacznie zwiększyć prędkość ładowania na systemach wielordzeniowych. Na przykład w poprzedniej wersji ładowanie bazy danych zawierającej 150 milionów wierszy na 10-rdzeniowym procesorze trwało 91 sekund, ale w nowej wersji operacja ta trwa 17 sekund. Istnieją dwa równoległe tryby ładowania - z zachowaniem kolejności rekordów i bez zachowania porządku.
  • Do kompresji danych wykorzystywany jest algorytm FSST (Fast Static Symbol Table), który umożliwia pakowanie danych w ciągi znaków przy użyciu wspólnego słownika typowych dopasowań. Zastosowanie nowego algorytmu umożliwiło zmniejszenie rozmiaru testowej bazy danych z 761MB do 251MB.
  • Zaproponowano algorytmy Chimp i Patas do kompresji liczb zmiennoprzecinkowych (DOUBLE i FLOAT). W porównaniu do poprzedniego algorytmu Gorillas, Chimp zapewnia wyższy poziom kompresji i szybszą dekompresję. Algorytm Patasa pozostaje w tyle za Chimpem pod względem stopnia kompresji, ale jest znacznie szybszy pod względem szybkości dekompresji, która prawie nie różni się od odczytu nieskompresowanych danych.
  • Dodano eksperymentalną możliwość ładowania danych z plików CSV do wielu równoległych strumieni (SET eksperymentalny_parallel_csv=true), co znacznie skraca czas ładowania dużych plików CSV. Na przykład po włączeniu tej opcji czas pobierania pliku CSV o wielkości 720 MB został skrócony z 3.5 do 0.6 sekundy.
  • Wprowadzono możliwość równoległego wykonywania operacji tworzenia i zarządzania indeksami. Na przykład operacja CREATE INDEX na kolumnie zawierającej 16 milionów rekordów została skrócona z 5.92 do 1.38 sekundy.
  • Włączono równoległość operacji agregacji w zapytaniach zawierających wyrażenie „COUNT(DISTINCT col)”.
  • SQL dodał obsługę typu UNION, który umożliwia powiązanie wielu typów z jednym elementem (na przykład „UNION(num INT, error VARCHAR))”).
  • SQL umożliwia tworzenie zapytań rozpoczynających się od słowa „FROM” zamiast „SELECT”. W tym przypadku zakłada się, że zapytanie zaczyna się od „SELECT *”.
  • SQL dodał obsługę wyrażenia COLUMNS, co pozwala na wykonanie operacji na wielu kolumnach bez duplikowania wyrażenia. Na przykład „WYBIERZ MIN(KOLUMNY(*)) z obs;” spowoduje wykonanie funkcji MIN dla każdej kolumny tabeli obs oraz "WYBIERZ KOLUMNY('val[0-9]+') z obs;" dla kolumn o nazwie składającej się z „val” i liczb.
  • Dodano obsługę operacji na listach, na przykład „WYBIERZ [x + 1 dla x w [1, 2, 3]] AS l;”.
  • Zoptymalizowano zużycie pamięci. Domyślnie platforma Linux używa biblioteki jemalloc do zarządzania pamięcią. Znacząco poprawiona wydajność operacji łączenia skrótów, gdy pamięć jest ograniczona.
  • Do interfejsu wiersza poleceń dodano tryb wyjściowy „.mode duckbox”, który odrzuca środkowe kolumny biorąc pod uwagę szerokość okna terminala (odpowiedni do szybkiej wizualnej oceny wyników zapytań z dużą liczbą kolumn, np. „WYBIERZ * FROM tbl”, które w trybie normalnym są rozłożone na kilka linii). Za pomocą parametru „.maxrows X” można dodatkowo ograniczyć liczbę wyświetlanych wierszy.
  • CLI zapewnia autouzupełnianie danych wejściowych z uwzględnieniem kontekstu (wprowadzanie słów kluczowych, nazw tabel, funkcji, nazw kolumn i nazw plików zostaje zakończone).
  • Interfejs CLI ma domyślnie włączony wskaźnik postępu zapytania.

Źródło: opennet.ru

Dodaj komentarz