JetBrains چگونه با DuckDB اجرای query میان چند database را به DataGrip آورد؟

چرا مهم است

اگر با چند اتصال database کار می‌کنی، این قابلیت اجازه می‌دهد داده‌های آن‌ها را بدون زیرساخت اضافه در یک query با هم join کنی. نکته مهم برایت این است که باید query را با SQL dialect خود DuckDB بنویسی.

قبل از خواندن، این‌ها را بدان۴ مفهوم
join

عملی در query که داده‌های دو یا چند جدول را بر اساس شرط مشخص به هم مرتبط می‌کند.

بیشتر درباره این مفهوم

table function

تابعی که خروجی آن به‌شکل جدول است و می‌توان از آن به‌عنوان منبع داده در query استفاده کرد.

بیشتر درباره این مفهوم

SQL dialect

مجموعه قواعد و قابلیت‌های SQL که یک موتور مشخص پشتیبانی می‌کند و ممکن است با موتورهای دیگر تفاوت داشته باشد.

بیشتر درباره این مفهوم

projection pushdown

نوعی بهینه‌سازی query که انتخاب ستون‌های موردنیاز را به مرحله خواندن داده نزدیک می‌کند تا ستون‌های غیرضروری خوانده نشوند.

بیشتر درباره این مفهوم

JetBrains برای اضافه‌کردن امکان اجرای یک query روی چند database در DataGrip،؜ به‌جای ساخت موتور اختصاصی، DuckDB را درون این ابزار قرار داده است. نتیجه این است که داده‌های PostgreSQL،؜ MySQL،؜ MongoDB یا هر database پشتیبانی‌شده دیگری می‌توانند بدون راه‌اندازی زیرساخت اضافه، در یک query با هم join شوند.

این قابلیت پاسخی به یکی از درخواست‌های قدیمی کاربران است: ترکیب داده‌های اتصال‌های مختلف در یک query. DataGrip از قبل می‌توانست query را روی هر اتصال جداگانه اجرا کند، اما موتوری نداشت که نتیجه‌های آن‌ها را به هم مرتبط کند. قابلیت‌های کار با database در دیگر IDE‌های JetBrains هم به‌صورت plugin ارائه می‌شوند؛ بنابراین کاربرد این امکان به خود DataGrip محدود نیست.

تیم برای حل مسئله، Apache Calcite،؜ پردازش مستقیم query با PSI و DuckDB را بررسی کرد. PSI نمایش داخلی ساختار کد در ابزارهای JetBrains است. به‌گفته Ilia Epelbaum از تیم DataGrip،؜ سادگی اتصال DuckDB به قابلیت‌های موجود، دلیل اصلی انتخاب آن بود. امکان ثبت یک table function سفارشی به تیم اجازه داد DuckDB را به سازوکار اجرای query در DataGrip متصل کند.

DuckDB در مقایسه با گزینه‌های سبک‌تری مانند H2،؜ قابلیت‌های بیشتری هم داشت؛ از جمله بهینه‌سازی‌هایی مانند projection pushdown. طبق توضیح تیم، گسترش برخی گزینه‌های embedded بررسی‌شده به native code یا پیاده‌سازی پیچیده نیاز داشت. در این مسیر، JetBrains مجبور نشد موتور اجرای query میان چند database را خودش بنویسد و نگهداری کند.

حضور DuckDB از کاربر پنهان نیست. query مربوط به join میان اتصال‌ها با SQL dialect آن نوشته می‌شود و DataGrip این موضوع را مشخص می‌کند. JetBrains همچنین DuckDB را به‌عنوان یک SQL dialect مستقل پشتیبانی می‌کند و Epelbaum در اضافه‌کردن syntax highlighting،؜ از جمله برای syntax معرفی‌شده در DuckDB 2.0،؜ مشارکت داشته است.

این راهکار هنوز نسخه اولیه است. تیم می‌خواهد ابتدا استفاده واقعی کاربران را بررسی کند و سپس بهره‌گیری بیشتری از بهینه‌سازی‌های DuckDB داشته باشد. استفاده از DuckDB برای خواندن منبع‌های داده مبتنی بر فایل نیز در برنامه قرار دارد؛ این بخش هنوز به‌عنوان مسیر آینده مطرح شده است.

نکته کلیدی

هنگام نوشتن join میان اتصال‌ها، قواعد DuckDB را مبنا قرار بده، نه SQL dialect هر database مبدأ را. همچنین خواندن فایل‌ها و استفاده گسترده‌تر از بهینه‌سازی‌ها را با قابلیت فعلی یکی نگیر؛ این‌ها در برنامه آینده تیم هستند.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)