الانتقال إلى المحتوى الرئيسي
تُعد العروض المادية القابلة للتحديث مشابهة من حيث الفكرة للعروض المادية في قواعد بيانات OLTP التقليدية؛ إذ تخزّن ناتج استعلام محدد لسرعة استرجاعه وتقليل الحاجة إلى إعادة تنفيذ الاستعلامات كثيفة الاستهلاك للموارد بشكل متكرر. وعلى عكس العروض المادية التزايدية في ClickHouse، يتطلب هذا النوع تنفيذ الاستعلام دوريًا على مجموعة البيانات كاملة، ثم تخزين نتائجه في جدول هدف للاستعلام عنها. ومن الناحية النظرية، ينبغي أن تكون مجموعة النتائج هذه أصغر من مجموعة البيانات الأصلية، مما يتيح تنفيذ الاستعلامات اللاحقة بسرعة أكبر. يوضح المخطط التالي آلية عمل العروض المادية القابلة للتحديث: يمكنك أيضًا مشاهدة الفيديو التالي:

متى ينبغي استخدام العروض المادية القابلة للتحديث؟

تُعد العروض المادية التزايدية في ClickHouse قوية للغاية، وعادةً ما تكون قابليتها للتوسع أفضل بكثير من النهج المستخدم في العروض المادية القابلة للتحديث، خاصةً في الحالات التي يلزم فيها إجراء aggregation على جدول واحد. فمن خلال احتساب aggregation فقط لكل block من البيانات عند insertه، ثم دمج الحالات التزايدية في الجدول النهائي، لا يُنفَّذ الـ query إلا على مجموعة فرعية من البيانات. ويمكن لهذا الأسلوب أن يتوسع ليصل إلى بيتابايتات من البيانات، وهو عادةً الأسلوب المفضل. ومع ذلك، هناك حالات استخدام لا تكون فيها هذه العملية التزايدية مطلوبة أو قابلة للتطبيق. فبعض المشكلات إما لا تتوافق مع النهج التزايدي أو لا تتطلب تحديثات في الوقت الفعلي، بحيث تكون إعادة البناء الدورية أكثر ملاءمة. على سبيل المثال، قد ترغب في إجراء إعادة احتساب كاملة لعرضٍ ما بانتظام على مجموعة البيانات بأكملها لأنه يستخدم عملية join معقدة، وهو ما لا يتوافق مع النهج التزايدي.
يمكن للعروض المادية القابلة للتحديث تشغيل عمليات دفعية لتنفيذ مهام مثل إلغاء التطبيع. ويمكن إنشاء تبعيات بين العروض المادية القابلة للتحديث بحيث يعتمد أحد العروض على نتائج عرض آخر، ولا يُنفَّذ إلا بعد اكتماله. ويمكن أن يحل هذا محل مسارات العمل المجدولة أو مخططات DAG البسيطة مثل مهمة dbt. ولمعرفة المزيد حول كيفية تعيين التبعيات بين العروض المادية القابلة للتحديث، انتقل إلى CREATE VIEW، قسم Dependencies.

كيف يتم تحديث عرض مادي قابل للتحديث؟

يُحدَّث العرض المادي القابل للتحديث تلقائيًا على فاصل زمني يُحدَّد أثناء الإنشاء. على سبيل المثال، يُحدَّث العرض المادي التالي كل دقيقة:
إذا أردت فرض تحديث عرض مادي، يمكنك استخدام العبارة SYSTEM REFRESH VIEW:
يمكنك أيضًا إلغاء العرض أو إيقافه أو تشغيله. لمزيد من التفاصيل، راجع توثيق إدارة العروض المادية القابلة للتحديث.

متى تم آخر تحديث للعرض المادي القابل للتحديث؟

لمعرفة وقت آخر تحديث للعرض المادي القابل للتحديث، يمكنك الاستعلام عن جدول النظام system.view_refreshes، كما هو موضح أدناه:

كيف يمكنني تغيير معدل التحديث؟

لتغيير معدل التحديث لعرض مادي قابل للتحديث، استخدم صيغة ALTER TABLE...MODIFY REFRESH.
بمجرد الانتهاء من ذلك، يمكنك استخدام استعلام متى كان آخر تحديث لعرض مادي قابل للتحديث؟ للتحقق من تحديث المعدّل:

استخدام APPEND لإضافة صفوف جديدة

تتيح لك وظيفة APPEND إضافة صفوف جديدة إلى نهاية الجدول بدلًا من استبدال العرض بأكمله. ومن استخدامات هذه الميزة التقاط لقطات للقيم في نقطة زمنية معيّنة. على سبيل المثال، لنتخيّل أن لدينا جدول events يُملأ بتدفّق من الرسائل من Kafka، أو Redpanda، أو أي منصة أخرى للبيانات المتدفقة.
تحتوي مجموعة البيانات هذه على 4096 قيمة في العمود uuid. ويمكننا كتابة الاستعلام التالي للعثور على القيم الأعلى من حيث العدد الإجمالي:
لنفترض أننا نريد تسجيل العدد لكل uuid كل 10 ثوانٍ وتخزينه في جدول جديد باسم events_snapshot. سيبدو مخطط events_snapshot كما يلي:
يمكننا بعد ذلك إنشاء عرض مادي قابل للتحديث لتعبئة هذا الجدول:
يمكننا بعد ذلك الاستعلام عن events_snapshot للحصول على العدد بمرور الوقت لقيمة uuid محددة:

أمثلة

لنرَ الآن كيفية استخدام العروض المادية القابلة للتحديث مع بعض مجموعات البيانات النموذجية.

Stack Overflow

يوضح دليل إزالة تطبيع البيانات تقنيات متنوعة لإزالة تطبيع البيانات باستخدام مجموعة بيانات Stack Overflow. نملأ هذه الجداول بالبيانات التالية: votes وusers وbadges وposts وpostlinks. في ذلك الدليل، أوضحنا كيفية إزالة تطبيع مجموعة بيانات postlinks ضمن جدول posts باستخدام الاستعلام التالي:
ثم أوضحنا كيفية إجراء insert لمرة واحدة لهذه البيانات في جدول posts_with_links، ولكن في نظام production، سنرغب في تشغيل هذه العملية بشكل دوري. قد يُحدَّث كلٌّ من جدولي posts وpostlinks. لذلك، بدلًا من محاولة تنفيذ عملية join هذه باستخدام العروض المادية التزايدية، قد يكون من الكافي ببساطة جدولة هذا الاستعلام ليعمل على فاصل زمني محدد، مثل مرة كل ساعة، مع تخزين النتائج في جدول post_with_links. وهنا يأتي دور العرض المادي القابل للتحديث، ويمكننا إنشاء واحد باستخدام الاستعلام التالي:
سيُنفَّذ العرض فورًا، ثم كل ساعة بعد ذلك وفقًا للإعدادات، لضمان انعكاس التحديثات على الجدول المصدر. والأهم من ذلك أنه عند إعادة تنفيذ الاستعلام، تُحدَّث مجموعة النتائج بصورة ذرّية وشفافة.
الصياغة هنا مطابقة لصياغة العرض المادي التزايدي، باستثناء أننا نُدرج بند REFRESH:

IMDb

في دليل تكامل dbt وClickHouse، ملأنا مجموعة بيانات IMDb بالجداول التالية: actors وdirectors وgenres وmovie_directors وmovies وroles. يمكننا بعد ذلك كتابة الاستعلام التالي لاستخراج ملخص لكل ممثل، مرتبًا حسب أكبر عدد من مرات الظهور في الأفلام.
لا يستغرق إرجاع النتيجة وقتًا طويلًا، ولكن لنفترض أننا نريدها أن تكون أسرع وأقل تكلفةً من الناحية الحسابية. ولنفترض أيضًا أن مجموعة البيانات هذه تخضع لتحديثات مستمرة، إذ تصدر أفلام جديدة باستمرار ويظهر كذلك ممثلون ومخرجون جدد. لقد حان وقت استخدام عرض مادي قابل للتحديث، لذا لننشئ أولًا الجدول الهدف للنتائج:
والآن يمكننا تعريف العرض:
سيُنفَّذ الـ view فورًا، ثم كل دقيقة بعد ذلك وفقًا للإعدادات، لضمان انعكاس التحديثات على جدول المصدر. كما يصبح استعلامنا السابق للحصول على ملخص للممثلين أبسطَ من حيث الصياغة وأسرعَ بكثير!
لنفترض أننا أضفنا ممثلًا جديدًا، وهو “Clicky McClickHouse”، إلى بيانات المصدر لدينا، واتضح أنه ظهر في عدد كبير من الأفلام!
بعد أقل من 60 ثانية بقليل، يُحدَّث الجدول المستهدف لدينا ليعكس غزارة أعمال Clicky التمثيلية:
آخر تعديل في ٢ يوليو ٢٠٢٦