Analitik ma'lumotlar bazalarida tezlik har doim birinchi o'rinda turadi. DuckDB jamoasi yaqinda e'lon qilgan 2.0 versiyasi, asinxron I/O va takomillashgan rekursiv CTE mexanizmlari bilan foydalanuvchilarga sezilarli darajada yuqori ishlash tezligini taklif etadi.
Versiyaning kelib chiqishi va asosiy maqsadi
DuckDB – bu yengil, o'rnatilgan analitik SQL dvigatelidir, asosan ma'lumotlar ilm-fani, ma'lumotlar ombori va ma'lumotlar pipeline'lari uchun mo'ljallangan. 2.0 versiyasi 2024-yil kuzida chiqarilishi rejalashtirilgan bo'lib, avvalgi 1.5.5 versiyasiga nisbatan bir necha asosiy komponentlarda tub o'zgarishlar kiritadi. Jamoa bu yangilanishni rasmiy blog postida batafsil tushuntiradi.
Asinxron I/O: S3 bilan ishlashda 2‑3 baravar tezlik
Eng oson seziladigan o'zgarish – asinxron I/O qo'llanilishi. Avvalgi versiyada har bir ishchi ip (worker) ma'lumotni yuklab olish va dekodlash vazifalarini ketma-ket bajarardi, natijada tarmoq kutishlari CPU faoliyatini susaytirardi. 2.0 versiyasida alohida yuklab olish iplari guruhlanib, bir vaqtning o'zida bir necha row group'ni buferga yuklaydi. Bu read_ahead_depth parametrining avtomatik -1 qiymati orqali boshqariladi.
Copy codeCREATE SECRET s3 (TYPE s3, PROVIDER credential_chain, REGION 'us-east-1');
SET enable_external_file_cache = false; -- so every run really hits S3
SELECT VoteTypeId, count(*) AS n
FROM read_parquet('s3://us-prd-motherduck-open-datasets/stackoverflow/parquet/2023-05/votes.parquet')
GROUP BY ALL ORDER BY 1;
- 2.2 GB Parquet faylini S3-dan o'qish: 18.8 s → 7.7 s
- 13.6 GB hajmdagi 23 ta Parquet fayl: 11.8 s → 3.9 s
- 1.7 GB CSV fayl: 116 s → 55 s
Natija shuki, tarmoq va CPU birgalikda ishlaydi, shuning uchun umumiy bajarilish vaqti ikki barobarga yaqin kamayadi. Kichik fayllar (1 MB atrofida) uchun esa farq kichik, chunki har bir faylga alohida round‑trip talab qilinadi.
Copy codeWITH RECURSIVE team(person) AS (
SELECT 'Ana'
UNION
SELECT e.employee FROM team t JOIN employees e ON e.manager = t.person
)
SELECT count(*) FROM team;
Rekursiv CTE'lar: chuqur ierarxik ma'lumotlarda 40‑x baravar tezlik
Ikkinchi muhim yangilanish – rekursiv Common Table Expression (CTE) mexanizmining qayta yozilishi. Avvalgi versiyada har bir daraja (round) uchun butun jadvalni qayta o'qish kerak bo'lgani sababli, chuqur ierarxik tuzilmalar (git tarixlari, mahsulot tarkibi, forum javoblari) sekin ishlardi. 2.0 versiyasida jadval bir marta o'qiladi, ota‑bola aloqalari indekslanadi va keyingi darajalar faqat kerakli satrlarni izlaydi.
Copy codeWITH RECURSIVE ancestors(id) AS (
SELECT max(id) FROM commits -- HEAD
UNION
SELECT p.parent_id FROM ancestors a JOIN commit_parents p ON p.commit_id = a.id
)
SELECT count(*) FROM ancestors;
Misol uchun, 20 000 commitdan iborat git tarixini izlash:
Copy code{"type": "purchase", "user": {"id": 42, "country": "FR", "premium": true},
"props": {"amount": 12.5, "currency": "EUR", "items": 2}, "tags": ["a", "b"]}
- 1.5.5 versiyada: 1.8 s – 16 s oralig'ida
- 2.0 alpha: 0.10 s (har bir bajarishda bir xil)
Bu natija, chuqur ierarxik ma'lumotlarni alohida graph bazasiga eksport qilish zaruratini yo'q qiladi, oddiy SQL so'rovi orqali ham samarali natija olish mumkinligini ko'rsatadi.
Copy code-- A: the JSON string
CREATE TABLE ev AS SELECT json AS payload FROM read_ndjson_objects('events.ndjson');
-- B: VARIANT
CREATE TABLE ev AS SELECT json::VARIANT AS payload FROM read_ndjson_objects('events.ndjson');
-- C: a normal table, one typed column per field
CREATE TABLE ev AS SELECT * FROM read_json('events.ndjson');
Yashirin yangiliklar va qo'shimcha optimallashtirishlar
Blog postida muallif yana bir necha kichik, lekin foydali o'zgarishlarni ta'kidladi:
Copy code-- Q1: filter on two fields
SELECT count(*) FROM ev
WHERE payload.type::VARCHAR = 'purchase' AND payload.user.country::VARCHAR = 'FR';
-- Q2: sum of a numeric sub-field, grouped
SELECT payload.user.country::VARCHAR AS country, sum(payload.props.amount::DOUBLE) AS amount
FROM ev WHERE payload.type::VARCHAR = 'purchase' GROUP BY ALL ORDER BY 1;
-- Q3: list lookup
SELECT count(*) FROM ev WHERE list_contains(payload.tags::VARCHAR[], 'c');
- read_ahead_depth parametrini qo'lda 0 ga o'rnatish orqali eski xulq-atvorni tiklash mumkin.
- Parquet fayllarini kichik bo'laklarga bo'lishning yomon amaliyoti haqida ogohlantirish – 2.0 versiyasi bu muammoni hal qilmaydi, balki asosiy arxitektura prinsiplarini saqlab qoladi.
- CSV fayllarini o'qishda ham sezilarli tezlik oshishi, lekin Parquet formatiga nisbatan farq kichikroq.
Cheklovlar va hali ham hal qilinishi kerak bo'lgan savollar
Yangi versiya ko'p jihatdan samarali bo'lsa-da, ba'zi cheklovlar mavjud:
Copy codeALTER TABLE ev ADD COLUMN type VARCHAR;
UPDATE ev SET type = payload.type::VARCHAR;
- Kichik fayllar uchun round‑trip kechikishi hali ham asosiy vaqtni egallaydi; bu holatni kamaytirish uchun fayl strukturasini qayta ko'rib chiqish zarur.
- Asinxron I/O faqat S3 kabi ob'ekt saqlash xizmatlari bilan sinovdan o'tkazildi; boshqa bulut provayderlari yoki on‑premise saqlash tizimlari uchun natijalar farq qilishi mumkin.
- Rekursiv CTE'ning yangi mexanizmi indeks yaratish jarayonini talab qiladi; juda katta jadvalda indeks yaratish vaqtini ham hisobga olish kerak.
Kelajakda DuckDB jamoasi bu nuqtalarni yanada optimallashtirishni rejalashtirayotganini e'lon qildi.
Kimlarga va qanday ta'sir qiladi?
DuckDB 2.0 ning tezlik oshishi ma'lumotlar olimlari, data engineer'lar va BI mutaxassislari uchun bevosita foyda keltiradi. Katta hajmdagi S3 ma'lumotlar omborlari bilan ishlovchi jamoalar tarmoq‑CPU sinergetsiyasidan foydalanib, pipeline'larni qisqa vaqt ichida bajarishi mumkin. Shuningdek, chuqur ierarxik ma'lumotlar bilan ishlaydigan loyihalar (git tahlili, materiallar ro'yxati, forum tahlili) alohida graph bazasiga o'tish zaruratisiz, SQL orqali samarali natija olishadi.
Umuman olganda, DuckDB 2.0 versiyasi analitik ma'lumotlar bazalari bozorida o'z o'rnini mustahkamlashga qaratilgan muhim qadam bo'lib, foydalanuvchilarga yanada tez, samarali va moslashuvchan vosita taqdim etadi.
Asl manba: motherduck.com