بدائل الإجراءات المخزنة في ClickHouse
لا يدعم ClickHouse الإجراءات المخزنة التقليدية التي تتضمن منطق التحكم في التدفق (IF/ELSE، والحلقات، وما إلى ذلك).
وهذا قرار تصميمي مقصود يستند إلى معمارية ClickHouse باعتباره قاعدة بيانات تحليلية.
ولا يُنصح باستخدام الحلقات في قواعد البيانات التحليلية، لأن معالجة O(n) من الاستعلامات البسيطة تكون عادةً أبطأ من معالجة عدد أقل من الاستعلامات المعقدة.
تم تحسين ClickHouse من أجل:
- أحمال العمل التحليلية - عمليات تجميع معقدة عبر مجموعات بيانات كبيرة
- المعالجة على دفعات - التعامل بكفاءة مع كميات كبيرة من البيانات
- الاستعلامات التصريحية - استعلامات SQL التي تصف البيانات المطلوب استرجاعها، لا كيفية معالجتها
الدوال المعرّفة من قبل المستخدم (UDFs)
تتيح لك الدوال المعرّفة من قبل المستخدم تغليف منطق قابل لإعادة الاستخدام من دون التحكم في التدفق. يدعم ClickHouse نوعين:UDFs المستندة إلى Lambda
أنشئ الدوال باستخدام تعبيرات SQL وبنية Lambda:بيانات نموذجية للأمثلة
بيانات نموذجية للأمثلة
- لا توجد حلقات أو بنى تحكم معقدة في التدفق
- لا يمكن تعديل البيانات (
INSERT/UPDATE/DELETE) - لا يُسمح بالدوال العودية
CREATE FUNCTION للاطلاع على البنية الكاملة.
دوال UDF القابلة للتنفيذ
للمنطق الأكثر تعقيدًا، استخدم دوال UDF القابلة للتنفيذ التي تستدعي برامج خارجية:العروض ذات المعلمات
تعمل العروض ذات المعلمات كأنها دوال تُرجِع مجموعات بيانات. وهي مثالية للاستعلامات القابلة لإعادة الاستخدام مع التصفية الديناميكية:بيانات نموذجية لهذا المثال
بيانات نموذجية لهذا المثال
حالات الاستخدام الشائعة
- تصفية نطاق التاريخ ديناميكيًا
- تقسيم البيانات حسب المستخدم
- الوصول إلى البيانات في البيئات متعددة المستأجرين
- قوالب التقارير
- إخفاء البيانات
العروض المادية
تُعد العروض المادية مثالية للحساب المسبق لعمليات التجميع المكلفة التي كانت تُنفَّذ تقليديًا داخل الإجراءات المخزنة. إذا كنت معتادًا على قواعد البيانات التقليدية، فاعتبر العرض المادي مُشغِّل INSERT يحوِّل البيانات ويجمعها تلقائيًا عند إدراجها في جدول المصدر:العروض المادية القابلة للتحديث
للمعالجة الدفعية المجدولة (مثل الإجراءات المخزنة الليلية):تنسيق العمليات خارجيًا
عند التعامل مع منطق أعمال معقّد، أو سير عمل ETL، أو عمليات متعددة الخطوات، يمكن دائمًا تنفيذ هذا المنطق خارج ClickHouse باستخدام مكتبات العملاء للغات البرمجة.استخدام شيفرة التطبيق
فيما يلي مقارنة جنبًا إلى جنب توضّح كيفية تحويل إجراء مخزّن في MySQL إلى شيفرة تطبيق عند استخدام ClickHouse:- الإجراء المخزن في MySQL
- شيفرة التطبيق في ClickHouse
الاختلافات الرئيسية
- التحكم في التدفق - تستخدم الإجراءات المخزنة في MySQL تعليمات
IF/ELSEوحلقاتWHILE. في ClickHouse، نفّذ هذا المنطق في شيفرة التطبيق لديك (بايثون، Java، إلخ.) - المعاملات - يدعم MySQL أوامر
BEGIN/COMMIT/ROLLBACKلمعاملات ACID. أما ClickHouse فهي قاعدة بيانات تحليلية مُحسّنة لأعباء العمل المعتمدة على الإلحاق فقط، وليست مخصّصة للتحديثات المعاملاتية - التحديثات - يستخدم MySQL عبارات
UPDATE. بينما يفضّل ClickHouse استخدامINSERTمع ReplacingMergeTree أو CollapsingMergeTree للبيانات القابلة للتغيير - المتغيرات والحالة - يمكن للإجراءات المخزنة في MySQL تعريف متغيرات (
DECLARE v_discount). في ClickHouse، أدر الحالة في شيفرة التطبيق لديك - معالجة الأخطاء - يدعم MySQL
SIGNALومعالجات الاستثناءات. وفي شيفرة التطبيق، استخدم آليات معالجة الأخطاء الأصلية في لغتك (try/catch)
استخدام أدوات تنسيق سير العمل
- Apache Airflow - جدولة مخططات DAG المعقدة لاستعلامات ClickHouse ومراقبتها
- dbt - تحويل البيانات باستخدام مهام سير عمل قائمة على SQL
- Prefect/Dagster - تنسيق حديث قائم على بايثون
- Custom schedulers - مهام Cron وCronJobs في Kubernetes وما إلى ذلك.
- إمكانات كاملة للغات البرمجة
- معالجة أفضل للأخطاء ومنطق أفضل لإعادة المحاولة
- التكامل مع الأنظمة الخارجية (واجهات برمجة التطبيقات، وقواعد البيانات الأخرى)
- التحكم في الإصدارات والاختبار
- المراقبة والتنبيهات
- جدولة أكثر مرونة
بدائل العبارات المُحضَّرة في ClickHouse
مع أن ClickHouse لا يدعم “العبارات المُحضَّرة” التقليدية بالمفهوم المتعارف عليه في أنظمة إدارة قواعد البيانات العلائقية، فإنه يوفّر معلمات الاستعلام التي تؤدي الغرض نفسه: استعلامات آمنة مُعلَّمة بمعلمات وتمنع حقن SQL.الصيغة
هناك طريقتان لتحديد معلمات الاستعلام:الطريقة 1: استخدام SET
مثال على الجدول والبيانات
مثال على الجدول والبيانات
الطريقة 2: استخدام معلَمات CLI
بنية المعاملات
يُشار إلى المعاملات باستخدام:{parameter_name: DataType}
parameter_name- اسم المعامل (من دون البادئةparam_)DataType- نوع بيانات ClickHouse الذي يُحوَّل المعامل إليه
أمثلة على أنواع البيانات
الجداول وبيانات العينة لهذا المثال
الجداول وبيانات العينة لهذا المثال
- السلاسل النصية والأرقام
- التواريخ والأوقات
- المصفوفات
- الخرائط
- المعرّفات
لاستخدام معلَمات الاستعلام في مكتبات العملاء للغات البرمجة، راجع وثائق مكتبة العميل الخاصة بلغة البرمجة التي تهمك.
قيود معلمات الاستعلام
معلمات الاستعلام ليست بدائل نصية عامة، بل لها قيود محددة:- هي مخصصة أساسًا لعبارات SELECT - وأفضل دعم لها يكون في استعلامات SELECT
- هي تعمل كمُعرّفات أو قيم حرفية - ولا يمكنها أن تحل محل أجزاء SQL عشوائية
- لديها دعم محدود لـ DDL - فهي مدعومة في
CREATE TABLE، ولكن ليس فيALTER TABLE
أفضل الممارسات الأمنية
استخدم دائمًا معلمات الاستعلام لأي إدخال من المستخدم:العبارات المُحضَّرة في بروتوكول MySQL
تتضمن واجهة MySQL في ClickHouse حدًا أدنى من دعم العبارات المُحضَّرة (COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_CLOSE)، وذلك أساسًا لإتاحة الاتصال بأدوات مثل Tableau Online التي تُغلّف الاستعلامات داخل عبارات مُحضَّرة.
القيود الأساسية:
- ربط المَعلمات غير مدعوم - لا يمكنك استخدام العناصر النائبة
?مع مَعلمات مرتبطة - تُخزَّن الاستعلامات، لكنها لا تُحلَّل أثناء
PREPARE - التنفيذ محدود جدًا ومصمم للتوافق مع أدوات BI محددة
الخلاصة
بدائل ClickHouse للإجراءات المخزنة
استخدام معلمات الاستعلام
يمكن استخدام معلمات الاستعلام للأغراض التالية:- منع حقن SQL
- الاستعلامات المُعلَّمة مع ضمان سلامة الأنواع
- التصفية الديناميكية في التطبيقات
- قوالب استعلام قابلة لإعادة الاستخدام
الوثائق ذات الصلة
CREATE FUNCTION- الدوال المعرّفة من قبل المستخدمCREATE VIEW- العروض، بما في ذلك العروض ذات المعلمات والعروض المادية- بنية SQL - معلمات الاستعلام - البنية الكاملة للمعلمات
- العروض المادية المتتالية - أنماط متقدمة للعروض المادية
- دوال UDF قابلة للتنفيذ - تنفيذ الدوال الخارجية